LiteOS相關(guān)內(nèi)核教程

1.LiteOS內(nèi)核的內(nèi)存管理

①首先打開上一篇使用的 HelloWorld 工程彼硫,基于此工程進(jìn)行實(shí)驗(yàn)。在Demo文件夾右擊鳍徽,新建文件夾osal_kernel_demo用于存放內(nèi)核的實(shí)驗(yàn)文件(如果已有請忽略這一步)乾吻。接下來在此文件夾中新建一個(gè)實(shí)驗(yàn)文件 osal_mem_demo.c,開始編寫代碼:

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

#include <osal.h>

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

static int mem_access_task_entry()

{

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

? ? size_t mem_size;? ? //申請的內(nèi)存塊大小

? ? uint8_t* mem_ptr = NULL;? ? //內(nèi)存塊指針

? ? while (1)

? ? {

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

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

? ? ? ? /* 嘗試申請分配內(nèi)存 */

? ? ? ? mem_ptr = osal_malloc(mem_size);

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

? ? ? ? if(mem_ptr != NULL)

? ? ? ? {

? ? ? ? ? ? /* 申請成功褒脯,打印信息 */

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

? ? ? ? ? ? /* 釋放申請的內(nèi)存,便于下次申請 */

? ? ? ? ? ? osal_free(mem_ptr);

? ? ? ? ? ? /* 將內(nèi)存塊指針置為NULL缆毁,避免稱為野指針 */

? ? ? ? ? ? mem_ptr = NULL;

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


? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? /* 申請失敗番川,打印信息,任務(wù)結(jié)束 */

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

? ? ? ? ? ? return 0;

? ? ? ? }

? ? }

}


/* 標(biāo)準(zhǔn)demo啟動(dòng)函數(shù)脊框,函數(shù)名不要修改颁督,否則會影響下一步實(shí)驗(yàn) */

int standard_app_demo_main()

{

? ? /* 創(chuàng)建任務(wù),任務(wù)優(yōu)先級為11缚陷,shell任務(wù)的優(yōu)先級為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_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中進(jìn)行編譯虎锚。那么硫痰,如何配置 CONFIG_USER_DEMO 宏定義呢?在工程根目錄下的.sdkconfig文件中的末尾即可配置:

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

2.LiteOS的互斥鎖

①首先打開上一篇使用的 HelloWorld 工程,基于此工程進(jìn)行實(shí)驗(yàn)柱徙。在Demo文件夾右擊缓屠,新建文件夾osal_kernel_demo用于存放內(nèi)核的實(shí)驗(yàn)文件(如果已有請忽略這一步)奇昙。接下來在此文件夾中新建一個(gè)實(shí)驗(yàn)文件 osal_mutex_demo.c,開始編寫代碼:

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

#include <osal.h>

/* 任務(wù)優(yōu)先級宏定義(shell任務(wù)的優(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;

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

static int user_task1_entry()

{

? ? while(1)

? ? {

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

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

? ? ? ? {

? ? ? ? ? ? /* 獲取到互斥鎖敌完,對共享資源進(jìn)行操作 */

? ? ? ? ? ? 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);

? ? ? ? ? ? /* 滿足條件則結(jié)束任務(wù) */

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

? ? ? ? ? ? ? ? break;

? ? ? ? ? ?

? ? ? ? }

? ? }

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

? ? return 0;

}

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

static int user_task2_entry()

{

? ? while (1)

? ? {

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

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

? ? ? ? {

? ? ? ? ? ? /* 獲取到互斥鎖滨溉,對共享資源進(jìn)行操作 */

? ? ? ? ? ? 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);

? ? ? ? ? ?

? ? ? ? ? ? /* 滿足條件則結(jié)束任務(wù) */

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

? ? ? ? ? ? ? ? break;

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

? ? ? ? ? ? osal_task_sleep(10);

? ? ? ? }

? ? }

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

? ? return 0;

}

/* 標(biāo)準(zhǔn)demo啟動(dòng)函數(shù)哟旗,函數(shù)名不要修改,否則會影響下一步實(shí)驗(yàn) */

int standard_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_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中進(jìn)行編譯近尚。那么蠕啄,如何配置 CONFIG_USER_DEMO 宏定義呢?在工程根目錄下的.sdkconfig文件中的末尾即可配置:

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

3.LiteOS內(nèi)核的任務(wù)管理

①首先打開之前創(chuàng)建的 HelloWorld 工程,基于此工程進(jìn)行實(shí)驗(yàn)格遭。在Demo文件夾右擊哈街,選擇新建文件夾:新建osal_kernel_demo文件夾,用于存放內(nèi)核的實(shí)驗(yàn)文件:接下來在此osal_kernel_demo文件夾中新建第一個(gè)實(shí)驗(yàn)文件osal_task_demo.c文件拒迅,開始編寫代碼:

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

#include <osal.h>


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

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

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


/* 任務(wù)ID */

uint32_t user_task1_id = 0;

uint32_t user_task2_id = 0;


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

static int user_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ù) */

static int user_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ù)名不要修改作箍,否則會影響下一步實(shí)驗(yàn) */

int standard_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文件中的末尾即可配置:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市递宅,隨后出現(xiàn)的幾起案子娘香,更是在濱河造成了極大的恐慌,老刑警劉巖办龄,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烘绽,死亡現(xiàn)場離奇詭異,居然都是意外死亡俐填,警方通過查閱死者的電腦和手機(jī)安接,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來英融,“玉大人盏檐,你說我怎么就攤上這事∈晃颍” “怎么了胡野?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痕鳍。 經(jīng)常有香客問我硫豆,道長,這世上最難降的妖魔是什么笼呆? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任熊响,我火速辦了婚禮,結(jié)果婚禮上诗赌,老公的妹妹穿的比我還像新娘汗茄。我一直安慰自己,他們只是感情好铭若,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布洪碳。 她就那樣靜靜地躺著,像睡著了一般奥喻。 火紅的嫁衣襯著肌膚如雪偶宫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天环鲤,我揣著相機(jī)與錄音纯趋,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吵冒,可吹牛的內(nèi)容都是我干的纯命。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼痹栖,長吁一口氣:“原來是場噩夢啊……” “哼亿汞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揪阿,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤疗我,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后南捂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吴裤,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年溺健,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了麦牺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鞭缭,死狀恐怖剖膳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岭辣,我是刑警寧澤吱晒,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站易结,受9級特大地震影響枕荞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搞动,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渣刷。 院中可真熱鬧鹦肿,春花似錦、人聲如沸辅柴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碌嘀。三九已至涣旨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間股冗,已是汗流浹背霹陡。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烹棉。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓攒霹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浆洗。 傳聞我的和親對象是個(gè)殘疾皇子催束,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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