LiteOS相關內核教程

1.LiteOS內核的內存管理

①首先打開上一篇使用的 HelloWorld 工程兰伤,基于此工程進行實驗。在Demo文件夾右擊昔字,新建文件夾osal_kernel_demo用于存放內核的實驗文件(如果已有請忽略這一步)。接下來在此文件夾中新建一個實驗文件 osal_mem_demo.c,開始編寫代碼:

/* 使用osal接口需要包含該頭文件 */

#include <osal.h>

/* 任務入口函數(shù) */

static int mem_access_task_entry()

{

? ? uint32_t i = 0;? ?? //循環(huán)變量

? ? size_t mem_size;? ? //申請的內存塊大小

? ? uint8_t* mem_ptr = NULL;? ? //內存塊指針

while (1)

? ? {

? ? ? ? /* 每次循環(huán)將申請內存的大小擴大一倍 */

? ? ? ? mem_size = 1 << i++

? ? ? ? /* 嘗試申請分配內存 */

? ? ? ? mem_ptr = osal_malloc(mem_size);

? ? ? ? /* 判斷是否申請成功 */

? ? ? ? if(mem_ptr != NULL)

? ? ? ? {

? ? ? ? ? ? /* 申請成功攒砖,打印信息 */

? ? ? ? ? ? printf("access %d bytes memory success!\r\n", mem_size);

? ? ? ? ? ? /* 釋放申請的內存缸兔,便于下次申請 */

? ? ? ? ? ? osal_free(mem_ptr);

? ? ? ? ? ? /* 將內存塊指針置為NULL,避免稱為野指針 */

? ? ? ? ? ? mem_ptr = NULL;

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

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? /* 申請失敗吹艇,打印信息惰蜜,任務結束 */

? ? ? ? ? ? printf("access %d bytes memory failed!\r\n", mem_size);

? ? ? ? ? ? return 0;

? ? ? ? }

? ? }

}

/* 標準demo啟動函數(shù),函數(shù)名不要修改受神,否則會影響下一步實驗 */

int standard_app_demo_main()

{

? ? /* 創(chuàng)建任務抛猖,任務優(yōu)先級為11,shell任務的優(yōu)先級為10 */

? ? osal_task_create("mem_access_task",mem_access_task_entry,NULL,0x400,NULL,11);

? ? return 0;

}

③編寫完成之后鼻听,要將我們編寫的 osal_mem_demo.c文件添加到makefile中财著,加入整個工程的編譯:

這里有個較為簡單的方法,直接修改Demo文件夾下的user_demo.mk配置文件撑碴,添加如下代碼:

#example for osal_mem_demo

ifeq ($(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中進行編譯。那么醉拓,如何配置 CONFIG_USER_DEMO 宏定義呢伟姐?在工程根目錄下的.sdkconfig文件中的末尾即可配置:

⑤程序燒錄之后,即可看到程序已經開始運行亿卤,在串口終端中可看到實驗的輸出內容:

2.LiteOS的互斥鎖

①首先打開上一篇使用的 HelloWorld 工程愤兵,基于此工程進行實驗。在Demo文件夾右擊排吴,新建文件夾osal_kernel_demo用于存放內核的實驗文件(如果已有請忽略這一步)恐似。接下來在此文件夾中新建一個實驗文件 osal_mutex_demo.c,開始編寫代碼:

②/* 使用osal接口需要包含該頭文件 */

#include

/* 任務優(yōu)先級宏定義(shell任務的優(yōu)先級為10) */

#define USER_TASK1_PRI? 12? //低優(yōu)先級

#define USER_TASK2_PRI? 11? //高優(yōu)先級

/* 共享資源 */

uint32_t public_value = 0;

/* 互斥鎖索引ID */

osal_mutex_t public_value_mutex;

/* 任務task1入口函數(shù) */

static int user_task1_entry()

{

? ? while(1)

? ? {

? ? ? ? /* 嘗試獲取互斥鎖 */

? ? ? ? if(true == osal_mutex_lock(public_value_mutex))

? ? ? ? {

? ? ? ? ? ? /* 獲取到互斥鎖傍念,對共享資源進行操作 */

? ? ? ? ? ? printf("\r\ntask1: lock a mutex.\r\n");

? ? ? ? ? ? public_value += 10;

printf("task1: public_value = %ld.\r\n", public_value);

? ? ? ? ? ? /* 對共享資源操作完畢矫夷,釋放互斥鎖 */

? ? ? ? ? ? printf("task1: unlock a mutex.\r\n\r\n");

osal_mutex_unlock(public_value_mutex);

? ? ? ? ? ? /* 滿足條件則結束任務 */

? ? ? ? ? ? if(public_value > 100)

? ? ? ? ? ? ? ? break;

? ? ? ? }

}

? ? /* while(1)會執(zhí)行結束,所以需要返回值 */

? ? return 0;

}

/* 任務task2入口函數(shù) */

static int user_task2_entry()

{

? ? while (1)

? ? {

? ? ? ? /* 嘗試獲取互斥鎖 */

? ? ?? if(true == osal_mutex_lock(public_value_mutex))

? ? ? ? {

? ? ? ? ? ? /* 獲取到互斥鎖憋槐,對共享資源進行操作 */

? ? ? ? ? ? printf("\r\ntask2: lock a mutex.\r\n");

? ? ? ? ? ? public_value += 5;

printf("task2: public_value = %ld.\r\n", public_value);

? ? ? ? ? ? /* 對共享資源操作完畢双藕,釋放互斥鎖 */

? ? ? ? ? ? printf("task2: unlock a mutex.\r\n\r\n");

? ? ? ? ? ? osal_mutex_unlock(public_value_mutex);

? ? ? ? ? ? /* 滿足條件則結束任務 */

? ? ? ? ? ? if(public_value > 90)

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? /* 優(yōu)先級較高,需要掛起一下阳仔,讓task1獲取到互斥鎖忧陪,否則task2再次上鎖,形成死鎖 */

? ? ? ? ? ? osal_task_sleep(10);

? ? ? ? }

}

? ? /* while(1)會執(zhí)行結束近范,所以需要返回值 */

? ? return 0;

}

/* 標準demo啟動函數(shù)嘶摊,函數(shù)名不要修改,否則會影響下一步實驗 */

int standard_app_demo_main()

{

? ? /* 創(chuàng)建互斥鎖public_value_mutex */

osal_mutex_create(&public_value_mutex);

? ? /* 創(chuàng)建任務task1 */

osal_task_create("user_task1",user_task1_entry,NULL,0x400,NULL,USER_TASK1_PRI);

? ? /* 創(chuàng)建任務task2 */

osal_task_create("user_task2",user_task2_entry,NULL,0x400,NULL,USER_TASK2_PRI);

? ? return 0;

}

③編寫完成之后评矩,要將我們編寫的 osal_mutex_demo.c文件添加到makefile中叶堆,加入整個工程的編譯:

這里有個較為簡單的方法,直接修改Demo文件夾下的user_demo.mk配置文件斥杜,添加如下代碼:

#example for osal_mutex_demo

ifeq ($(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中進行編譯沥匈。那么,如何配置 CONFIG_USER_DEMO 宏定義呢忘渔?在工程根目錄下的.sdkconfig文件中的末尾即可配置:

⑤程序燒錄之后高帖,即可看到程序已經開始運行,在串口終端中可看到實驗的輸出內容:

3.LiteOS內核的任務管理

①首先打開之前創(chuàng)建的 HelloWorld 工程畦粮,基于此工程進行實驗散址。在Demo文件夾右擊,選擇新建文件夾:新建osal_kernel_demo文件夾宣赔,用于存放內核的實驗文件:接下來在此osal_kernel_demo文件夾中新建第一個實驗文件osal_task_demo.c文件爪飘,開始編寫代碼:

②/* 使用osal接口需要包含該頭文件 */

#include <osal.h>

/* 任務優(yōu)先級宏定義(shell任務的優(yōu)先級為10) */

#define USER_TASK1_PRI? 12? //低優(yōu)先級

#define USER_TASK2_PRI? 11? //高優(yōu)先級

/* 任務ID */

uint32_t user_task1_id = 0;

uint32_t user_task2_id = 0;

/* 任務task1入口函數(shù) */

static int user_task1_entry()

{

? ? int n = 0;

? ? /* 每隔2s在串口打印一次,打印5次后主動結束 */

? ? for(n = 0; n < 5; n++)

? ? {

? ? ? ? printf("task1: my task id is %ld, n = %d!\r\n", user_task1_id, n);

? ? ? ? /* 任務主動掛起2s */

? ? ? ? osal_task_sleep(2*1000);

? ? }

? ? printf("user task 1 exit!\r\n");

? ? /* 任務結束 */

? ? return 0;

}

/* 任務task2入口函數(shù) */

static int user_task2_entry()

{

? ? /* 每隔2s在串口打印一次拉背,不結束 */

? ? while (1)

? ? {

? ? ? ? printf("task 2: my task id is %ld!\r\n", user_task2_id);

? ? ? ? /* 任務主動掛起2s */

? ? ? ? osal_task_sleep(2*1000);

? ? }

}

/* 標準demo啟動函數(shù)师崎,函數(shù)名不要修改,否則會影響下一步實驗 */

int standard_app_demo_main()

{

? ? /* 創(chuàng)建任務task1 */

? ? user_task1_id = osal_task_create("user_task1",user_task1_entry,NULL,0x400,NULL,USER_TASK1_PRI);

? ? /* 創(chuàng)建任務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中犁罩,加入整個工程的編譯:這里有個較為簡單的方法,直接修改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中進行編譯。那么诱渤,如何配置 CONFIG_USER_DEMO 宏定義呢丐巫?在工程根目錄下的.sdkconfig文件中的末尾即可配置:

⑤程序燒錄之后,即可看到程序已經開始運行勺美,在串口終端中可看到實驗的輸出內容:

作者:鯊魚沙拉

鏈接:http://www.reibang.com/p/300f57940931

來源:簡書

著作權歸作者所有递胧。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處赡茸。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末缎脾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子占卧,更是在濱河造成了極大的恐慌遗菠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件华蜒,死亡現(xiàn)場離奇詭異辙纬,居然都是意外死亡,警方通過查閱死者的電腦和手機叭喜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門贺拣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人域滥,你說我怎么就攤上這事纵柿。” “怎么了启绰?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵昂儒,是天一觀的道長。 經常有香客問我委可,道長渊跋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任着倾,我火速辦了婚禮拾酝,結果婚禮上,老公的妹妹穿的比我還像新娘卡者。我一直安慰自己蒿囤,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布崇决。 她就那樣靜靜地躺著材诽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恒傻。 梳的紋絲不亂的頭發(fā)上脸侥,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音盈厘,去河邊找鬼睁枕。 笑死,一個胖子當著我的面吹牛沸手,可吹牛的內容都是我干的外遇。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼契吉,長吁一口氣:“原來是場噩夢啊……” “哼臀规!你這毒婦竟也來了?” 一聲冷哼從身側響起栅隐,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤塔嬉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后租悄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谨究,經...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年泣棋,在試婚紗的時候發(fā)現(xiàn)自己被綠了胶哲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡潭辈,死狀恐怖鸯屿,靈堂內的尸體忽然破棺而出澈吨,到底是詐尸還是另有隱情,我是刑警寧澤寄摆,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布谅辣,位于F島的核電站,受9級特大地震影響婶恼,放射性物質發(fā)生泄漏桑阶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一勾邦、第九天 我趴在偏房一處隱蔽的房頂上張望蚣录。 院中可真熱鬧,春花似錦眷篇、人聲如沸萎河。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽公壤。三九已至,卻和暖如春椎椰,著一層夾襖步出監(jiān)牢的瞬間厦幅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工慨飘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留确憨,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓瓤的,卻偏偏與公主長得像休弃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子圈膏,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內容

  • 1.LiteOS內核的內存管理 ①首先打開上一篇使用的 HelloWorld 工程塔猾,基于此工程進行實驗。在Demo...
    土豆拌白米飯閱讀 632評論 0 0
  • 1.LiteOS內核的內存管理 ①首先打開上一篇使用的 HelloWorld 工程稽坤,基于此工程進行實驗丈甸。在Demo...
    鯊魚沙拉閱讀 423評論 0 0
  • 3. 動手實驗 —— 體驗任務的創(chuàng)建與切換 實驗內容 本實驗中將創(chuàng)建兩個任務,一個低優(yōu)先級任務task1尿褪,一個高優(yōu)...
    sss_7f59閱讀 810評論 0 0
  • 本次內容主要以 為主睦擂, 、 杖玲、 顿仇、 、 ,以及 臼闻, 及 鸿吆。在 中,一個任務就是一個線程述呐,多個任務按照優(yōu)先級進行搶占...
    窺菏閱讀 1,643評論 1 0
  • 久違的晴天惩淳,家長會。 家長大會開好到教室時市埋,離放學已經沒多少時間了黎泣。班主任說已經安排了三個家長分享經驗恕刘。 放學鈴聲...
    飄雪兒5閱讀 7,528評論 16 22