任務(wù)一:任務(wù)的創(chuàng)建與切換
在Demo建立文件夾:

新建osal_kernel_demo文件夾
在osal_kernel_demo中開始編寫代碼

編寫后要將我們編寫的osal_task_demo.c文件添加到新建第的實(shí)驗(yàn)文件osal_task_demo.c文件,開始編寫代碼:/*?使用osal接口需要包含該頭文件?*/#include/*?任務(wù)優(yōu)先級(jí)宏定義(shell任務(wù)的優(yōu)先級(jí)為10)?*/#defineUSER_TASK1_PRI??12//低優(yōu)先級(jí)#defineUSER_TASK2_PRI??11//高優(yōu)先級(jí)/*?任務(wù)ID?*/uint32_tuser_task1_id=0;uint32_tuser_task2_id=0;/*?任務(wù)task1入口函數(shù)?*/staticintuser_task1_entry(){intn=0;/*?每隔2s在串口打印一次,打印5次后主動(dòng)結(jié)束?*/for(n=0;n<5;n++){printf("task1:?my?task?id?is?%ld,?n?=?%d!\r\n",user_task1_id,n);/*?任務(wù)主動(dòng)掛起2s?*/osal_task_sleep(2*1000);}printf("user?task?1?exit!\r\n");/*?任務(wù)結(jié)束?*/return0;}/*?任務(wù)task2入口函數(shù)?*/staticintuser_task2_entry(){/*?每隔2s在串口打印一次,不結(jié)束?*/while(1){printf("task?2:?my?task?id?is?%ld!\r\n",user_task2_id);/*?任務(wù)主動(dòng)掛起2s?*/osal_task_sleep(2*1000);}}/*?標(biāo)準(zhǔn)demo啟動(dòng)函數(shù),函數(shù)名不要修改,否則會(huì)影響下一步實(shí)驗(yàn)?*/intstandard_app_demo_main(){/*?創(chuàng)建任務(wù)task1?*/user_task1_id=osal_task_create("user_task1",user_task1_entry,NULL,0x400,NULL,USER_TASK1_PRI);/*?創(chuàng)建任務(wù)task2?*/user_task2_id=osal_task_create("user_task2",user_task2_entry,NULL,0x400,NULL,USER_TASK2_PRI);return0;}
編寫完成之后,要將我們編寫的osal_task_demo.c文件添加到makefile中,加入整個(gè)工程的編譯:
這里有個(gè)較為簡(jiǎn)單的方法,直接修改Demo文件夾下的user_
demo.mk配置文件,添加如下代碼:
#example?for osal_task_demoifeq($(CONFIG_USER_DEMO),"osal_task_demo")user_demo_src=${wildcard?$(TOP_DIR)/targets/STM32L431_BearPi/Demos/osal_kernel_demo/osal_task_demo.c}user_demo_defs=-DCONFIG_OSAL_TASK_DEMO_ENABLE=1endif
之后在工程根目錄下的.sdkconfig文件中的末尾進(jìn)行配置
因?yàn)槲覀冃薷牧薽k配置文件,所以點(diǎn)擊重新編譯按鈕進(jìn)行編譯,編譯完成后點(diǎn)擊下載按鈕燒錄程序。
實(shí)驗(yàn)現(xiàn)象:程序燒錄之后,即可看到程序已經(jīng)開始運(yùn)行,在串口終端中可看到實(shí)驗(yàn)的輸出內(nèi)容:

?? 任務(wù)二:LiteOS的互斥鎖
? 在Demo文件夾中新建一個(gè)實(shí)驗(yàn)文件 osal_mutex_demo.c,開始編寫代碼

/*?使用osal接口需要包含該頭文件?*/#include/*?任務(wù)優(yōu)先級(jí)宏定義(shell任務(wù)的優(yōu)先級(jí)為10)?*/#defineUSER_TASK1_PRI??12//低優(yōu)先級(jí)#defineUSER_TASK2_PRI??11//高優(yōu)先級(jí)/*?共享資源?*/uint32_tpublic_value=0;/*?互斥鎖索引ID?*/osal_mutex_t?public_value_mutex;/*?任務(wù)task1入口函數(shù)?*/staticintuser_task1_entry(){while(1){/*?嘗試獲取互斥鎖?*/if(true==osal_mutex_lock(public_value_mutex)){/*?獲取到互斥鎖,對(duì)共享資源進(jìn)行操作?*/printf("\r\ntask1:?lock?a?mutex.\r\n");public_value+=10;printf("task1:?public_value?=?%ld.\r\n",public_value);/*?對(duì)共享資源操作完畢,釋放互斥鎖?*/printf("task1:?unlock?a?mutex.\r\n\r\n");osal_mutex_unlock(public_value_mutex);/*?滿足條件則結(jié)束任務(wù)?*/if(public_value>100)break;}}/*?while(1)會(huì)執(zhí)行結(jié)束,所以需要返回值?*/return0;}/*?任務(wù)task2入口函數(shù)?*/staticintuser_task2_entry(){while(1){/*?嘗試獲取互斥鎖?*/if(true==osal_mutex_lock(public_value_mutex)){/*?獲取到互斥鎖,對(duì)共享資源進(jìn)行操作?*/printf("\r\ntask2:?lock?a?mutex.\r\n");public_value+=5;printf("task2:?public_value?=?%ld.\r\n",public_value);/*?對(duì)共享資源操作完畢,釋放互斥鎖?*/printf("task2:?unlock?a?mutex.\r\n\r\n");osal_mutex_unlock(public_value_mutex);/*?滿足條件則結(jié)束任務(wù)?*/if(public_value>90)break;/*?優(yōu)先級(jí)較高,需要掛起一下,讓task1獲取到互斥鎖,否則task2再次上鎖,形成死鎖?*/osal_task_sleep(10);}}/*?while(1)會(huì)執(zhí)行結(jié)束,所以需要返回值?*/return0;}/*?標(biāo)準(zhǔn)demo啟動(dòng)函數(shù),函數(shù)名不要修改,否則會(huì)影響下一步實(shí)驗(yàn)?*/intstandard_app_demo_main(){/*?創(chuàng)建互斥鎖public_value_mutex?*/osal_mutex_create(&public_value_mutex);/*?創(chuàng)建任務(wù)task1?*/osal_task_create("user_task1",user_task1_entry,NULL,0x400,NULL,USER_TASK1_PRI);/*?創(chuàng)建任務(wù)task2?*/osal_task_create("user_task2",user_task2_entry,NULL,0x400,NULL,USER_TASK2_PRI);return0;}
編寫完成之后,要將我們編寫的?osal_mutex_demo.c文件添加到makefile中,加入整個(gè)工程的編譯:
這里有個(gè)較為簡(jiǎn)單的方法,直接修改Demo文件夾下的user_
demo.mk配置文件,添加如下代碼:
#example?for?osal_mutex_demoifeq($(CONFIG_USER_DEMO),"osal_mutex_demo")user_demo_src=${wildcard?$(TOP_DIR)/targets/STM32L431_BearPi/Demos/osal_kernel_demo/osal_mutex_demo.c}endif
添加位置如圖:

?CONFIG_USER_DEMO 宏定義,在工程根目錄下的.sdkconfig文件中的末尾配置

實(shí)驗(yàn)現(xiàn)象
程序燒錄之后,即可看到程序已經(jīng)開始運(yùn)行,在串口終端中可看到實(shí)驗(yàn)的輸出內(nèi)容:
