LiteOS內(nèi)核教程03-任務(wù)管理

3. 動(dòng)手實(shí)驗(yàn) —— 體驗(yàn)任務(wù)的創(chuàng)建與切換

實(shí)驗(yàn)內(nèi)容

本實(shí)驗(yàn)中將創(chuàng)建兩個(gè)任務(wù),一個(gè)低優(yōu)先級(jí)任務(wù)task1,一個(gè)高優(yōu)先級(jí)任務(wù)task2栅干,兩個(gè)任務(wù)都會(huì)每隔2s在串口打印自己的任務(wù)id號(hào)邦蜜,在串口終端中觀察兩個(gè)任務(wù)的運(yùn)行情況字管。

在Demo文件夾右擊独泞,選擇新建文件夾:


新建osal_kernel_demo文件夾遥赚,用于存放內(nèi)核的實(shí)驗(yàn)文件:


在osal_kernel_demo文件夾中新建第一個(gè)實(shí)驗(yàn)文件osal_task_demo.c文件


在osal_task_demo.c文件內(nèi)編寫代碼:


/* 使用osal接口需要包含該頭文件 */#include<osal.h>/* 任務(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_t user_task1_id = 0;uint32_t user_task2_id = 0;/* 任務(wù)task1入口函數(shù) */staticintuser_task1_entry(){

? ? int n = 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é)束 */? ? return 0;

}/* 任務(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);

? ? return 0;

}

編寫完成之后孕惜,要將我們編寫的osal_task_demo.c文件添加到makefile中,加入整個(gè)工程的編譯:

這里有個(gè)較為簡單的方法晨炕,直接修改Demo文件夾下的user_demo.mk配置文件衫画,添加如下代碼:

#example for osal_task_demo ifeq ($(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 = -D CONFIG_OSAL_TASK_DEMO_ENABLE=1 endif

添加位置如圖:


這段代碼的意思是:

如果 CONFIG_USER_DEMO 宏定義的值是osal_task_demo,則將osal_task_demo.c文件加入到makefile中進(jìn)行編譯瓮栗。

那么削罩,如何配置 CONFIG_USER_DEMO 宏定義呢?在工程根目錄下的.sdkconfig文件中的末尾即可配置:



因?yàn)槲覀冃薷牧薽k配置文件费奸,所以點(diǎn)擊重新編譯按鈕進(jìn)行編譯弥激,編譯完成后點(diǎn)擊下載按鈕燒錄程序。

實(shí)驗(yàn)現(xiàn)象

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





LiteOS內(nèi)核教程05-互斥鎖

3. 動(dòng)手實(shí)驗(yàn) —— 使用互斥鎖進(jìn)行資源保護(hù)

實(shí)驗(yàn)內(nèi)容

本實(shí)驗(yàn)中將創(chuàng)建兩個(gè)任務(wù),一個(gè)低優(yōu)先級(jí)任務(wù)task1缨历,一個(gè)高優(yōu)先級(jí)任務(wù)task2以蕴,兩個(gè)任務(wù)之間依次對(duì)共享資源上鎖、操作辛孵、解鎖丛肮,在串口終端中觀察兩個(gè)任務(wù)的運(yùn)行情況。

在Demo文件夾右擊魄缚,新建文件夾osal_kernel_demo用于存放內(nèi)核的實(shí)驗(yàn)文件(如果已有請(qǐng)忽略這一步)宝与。

接下來在此文件夾中新建一個(gè)實(shí)驗(yàn)文件?osal_mutex_demo.c,開始編寫代碼:


/* 使用osal接口需要包含該頭文件 */#include<osal.h>/* 任務(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_t public_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é)束节值,所以需要返回值 */? ? return 0;

}/* 任務(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é)束,所以需要返回值 */? ? return 0;

}/* 標(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);

? ? return 0;

}

編寫完成之后,要將我們編寫的 osal_mutex_demo.c文件添加到makefile中拒贱,加入整個(gè)工程的編譯:

這里有個(gè)較為簡單的方法宛徊,直接修改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 宏定義的值是osal_mutex_demo逻澳,則將osal_mutex_demo.c文件加入到makefile中進(jìn)行編譯闸天。

那么,如何配置 CONFIG_USER_DEMO 宏定義呢斜做?在工程根目錄下的.sdkconfig文件中的末尾即可配置:


因?yàn)槲覀冃薷牧薽k配置文件苞氮,所以點(diǎn)擊重新編譯按鈕進(jìn)行編譯,編譯完成后點(diǎn)擊下載按鈕燒錄程序瓤逼。

實(shí)驗(yàn)現(xiàn)象

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




LiteOS內(nèi)核教程06-內(nèi)存管理

3. 動(dòng)手實(shí)驗(yàn) —— 測試動(dòng)態(tài)內(nèi)存分配的最大字節(jié)

實(shí)驗(yàn)內(nèi)容

本實(shí)驗(yàn)中將創(chuàng)建一個(gè)任務(wù)霸旗,從最小字節(jié)開始贷帮,不停的申請(qǐng)分配內(nèi)存,釋放分配的內(nèi)存诱告,直到申請(qǐng)失敗皿桑,串口終端中觀察可以申請(qǐng)到的最大字節(jié)。

實(shí)驗(yàn)代碼

首先打開上一篇使用的 HelloWorld 工程蔬啡,基于此工程進(jìn)行實(shí)驗(yàn)诲侮。

在Demo文件夾右擊,新建文件夾osal_kernel_demo用于存放內(nèi)核的實(shí)驗(yàn)文件(如果已有請(qǐng)忽略這一步)箱蟆。

接下來在此文件夾中新建一個(gè)實(shí)驗(yàn)文件?osal_mem_demo.c沟绪,開始編寫代碼:


/* 使用osal接口需要包含該頭文件 */#include<osal.h>/* 任務(wù)入口函數(shù) */staticintmem_access_task_entry(){

? ? uint32_t i = 0;? ? //循環(huán)變量? ? size_t mem_size;? ? //申請(qǐng)的內(nèi)存塊大小? ? uint8_t* mem_ptr = NULL;? ? //內(nèi)存塊指針? ? while (1)

? ? {

? ? ? ? /* 每次循環(huán)將申請(qǐng)內(nèi)存的大小擴(kuò)大一倍 */? ? ? ? mem_size = 1 << i++;

? ? ? ? /* 嘗試申請(qǐng)分配內(nèi)存 */? ? ? ? mem_ptr = osal_malloc(mem_size);

? ? ? ? /* 判斷是否申請(qǐng)成功 */? ? ? ? if(mem_ptr != NULL)

? ? ? ? {

? ? ? ? ? ? /* 申請(qǐng)成功,打印信息 */? ? ? ? ? ? printf("access %d bytes memory success!\r\n", mem_size);

? ? ? ? ? ? /* 釋放申請(qǐng)的內(nèi)存空猜,便于下次申請(qǐng) */? ? ? ? ? ? osal_free(mem_ptr);

? ? ? ? ? ? /* 將內(nèi)存塊指針置為NULL绽慈,避免稱為野指針 */? ? ? ? ? ? mem_ptr = NULL;

? ? ? ? ? ? printf("free memory success!\r\n");


? ? ? ? }

? ? ? ? else? ? ? ? {

? ? ? ? ? ? /* 申請(qǐng)失敗恨旱,打印信息,任務(wù)結(jié)束 */? ? ? ? ? ? printf("access %d bytes memory failed!\r\n", mem_size);

? ? ? ? ? ? return 0;

? ? ? ? }

? ? }

}/* 標(biāo)準(zhǔn)demo啟動(dòng)函數(shù)坝疼,函數(shù)名不要修改搜贤,否則會(huì)影響下一步實(shí)驗(yàn) */intstandard_app_demo_main(){

? ? /* 創(chuàng)建任務(wù),任務(wù)優(yōu)先級(jí)為11钝凶,shell任務(wù)的優(yōu)先級(jí)為10 */? ? osal_task_create("mem_access_task",mem_access_task_entry,NULL,0x400,NULL,11);

? ? return 0;

}

編寫完成之后仪芒,要將我們編寫的 osal_mem_demo.c文件添加到makefile中,加入整個(gè)工程的編譯:

這里有個(gè)較為簡單的方法耕陷,直接修改Demo文件夾下的user_demo.mk配置文件掂名,添加如下代碼:

#example for osal_mem_demoifeq ($(CONFIG_USER_DEMO), "osal_mem_demo")

? ? user_demo_src? = ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Demos/osal_kernel_demo/osal_mem_demo.c}

endif

添加位置如圖:


這段代碼的意思是:

如果 CONFIG_USER_DEMO 宏定義的值是osal_mem_demo,則將osal_mem_demo.c文件加入到makefile中進(jìn)行編譯哟沫。

那么饺蔑,如何配置 CONFIG_USER_DEMO 宏定義呢?在工程根目錄下的.sdkconfig文件中的末尾即可配置:


因?yàn)槲覀冃薷牧薽k配置文件嗜诀,所以點(diǎn)擊重新編譯按鈕進(jìn)行編譯猾警,編譯完成后點(diǎn)擊下載按鈕燒錄程序。

實(shí)驗(yàn)現(xiàn)象

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


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筑公,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尊浪,老刑警劉巖匣屡,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拇涤,居然都是意外死亡捣作,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門鹅士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來券躁,“玉大人,你說我怎么就攤上這事掉盅∫舶荩” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵趾痘,是天一觀的道長慢哈。 經(jīng)常有香客問我,道長永票,這世上最難降的妖魔是什么卵贱? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任滥沫,我火速辦了婚禮,結(jié)果婚禮上键俱,老公的妹妹穿的比我還像新娘兰绣。我一直安慰自己,他們只是感情好编振,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布缀辩。 她就那樣靜靜地躺著,像睡著了一般党觅。 火紅的嫁衣襯著肌膚如雪雌澄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天杯瞻,我揣著相機(jī)與錄音镐牺,去河邊找鬼。 笑死魁莉,一個(gè)胖子當(dāng)著我的面吹牛睬涧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旗唁,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼畦浓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了检疫?” 一聲冷哼從身側(cè)響起讶请,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屎媳,沒想到半個(gè)月后夺溢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烛谊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年风响,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丹禀。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡状勤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出双泪,到底是詐尸還是另有隱情持搜,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布焙矛,位于F島的核電站朵诫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏薄扁。R本人自食惡果不足惜剪返,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一废累、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脱盲,春花似錦邑滨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至面哥,卻和暖如春哎壳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尚卫。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工归榕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吱涉。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓刹泄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怎爵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子特石,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.LiteOS內(nèi)核的內(nèi)存管理 ①首先打開上一篇使用的 HelloWorld 工程,基于此工程進(jìn)行實(shí)驗(yàn)鳖链。在Demo...
    土豆拌白米飯閱讀 621評(píng)論 0 0
  • 任務(wù)一: 任務(wù)的創(chuàng)建與切換 實(shí)驗(yàn)內(nèi)容 在本實(shí)驗(yàn)中將要?jiǎng)?chuàng)建兩個(gè)任務(wù)姆蘸,一個(gè)低優(yōu)先級(jí)任務(wù)task1,一個(gè)高優(yōu)先級(jí)任務(wù)ta...
    獨(dú)孤尚青閱讀 431評(píng)論 0 0
  • 漸變的面目拼圖要我怎么拼兰粉? 我是疲乏了還是投降了故痊? 不是不允許自己墜落顶瞳, 我沒有滴水不進(jìn)的保護(hù)膜。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,237評(píng)論 0 13
  • 夜鶯2517閱讀 127,717評(píng)論 1 9
  • 版本:ios 1.2.1 亮點(diǎn): 1.app角標(biāo)可以實(shí)時(shí)更新天氣溫度或選擇空氣質(zhì)量愕秫,建議處女座就不要選了慨菱,不然老想...
    我就是沉沉閱讀 6,883評(píng)論 1 6