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è)轉載請注明出處赡茸。