基於STM32使用HAL庫手把手移植華爲LiteOS系統
(一)說明
本章節實驗工程源碼下載:https://github.com/wowyyy/STM32_LiteOS_Demogit
華爲LiteOS內核源碼下載地址:https://github.com/LiteOS/LiteOS,選擇develop分支下載。github
(二)裸機工程建立
使用STM32CubeMX建立裸機工程:less
這裏我是用的芯片是STM32F103RBT6,時鐘主頻爲72MHz,配置時鐘樹:函數
配置調試串口1:測試
配置兩個LED燈:
url
因爲LiteOS使用系統嘀嗒定時器看成心跳,HAL庫也使用了這個定時器,因此咱們將HAL庫的定時器改成其餘,這裏我該爲了定時器4:spa
配置中斷,這裏我選擇了組4,也就是所有爲搶佔優先級:
.net
取消掉如下兩個中斷服務函數的生成,由於ListOS已經實現了這兩個函數:
3d
最後輸出工程便可!
調試
(三)移植LiteOS
下載解壓LiteOS,咱們須要的文件有:
LiteOS-develop\arch\arm\arm-m\cortex-m3\keil\los_dispatch_keil.S
(注:由於我使用的是STM32F1系列是M3內核因此選擇cortex-m3文件夾下的,若是是F4系列那麼就是M4內核應該選擇cortex-m4文件夾下的文件)LiteOS-develop\arch\arm\arm-m\src
目錄下所有源文件LiteOS-develop\kernel\base\core
目錄下所有源文件LiteOS-develop\kernel\base\ipc
目錄下所有源文件LiteOS-develop\kernel\base\mem\bestfit_little
目錄下所有源文件LiteOS-develop\kernel\base\mem\common
目錄下所有源文件LiteOS-develop\kernel\base\mem\membox
目錄下所有源文件LiteOS-develop\kernel\base\misc
目錄下所有源文件LiteOS-develop\kernel\base\om
目錄下所有源文件LiteOS-develop\kernel\base\core
目錄下所有源文件LiteOS-develop\kernel\base\core
目錄下所有源文件LiteOS\kernel\extended\tickless
目錄下所有源文件LiteOS\kernel\los_init.c
- 拷貝示例工程下的
OS_CONFIG
目錄下的頭文件 (此目錄是在示例工程LiteOS-develop\targets\STM32F103VET6_NB_GCC\OS_CONFIG
中)
在Keil中添加源碼,以下圖所示:
添加頭文件包含,以下圖所示:
-
修改
OS_CONFIG/target_config.h
文件,找到BOARD_SRAM_SIZE_KB
宏,此宏定義了SRAM(內存)的大小,STM32F103RB是20K,因此此處改成20。 -
修改宏
LOSCFG_PLATFORM_HWI
爲NO。此宏控制着系統中斷的管理方式,爲NO表示系統中斷不被系統管理,爲YES表示系統接管中斷。STM32的中斷管理已經很好了不須要系統接管。
(四)系統運行測試
這裏建立了三個任務:
- led1燈間隔1m反轉電平
- led2燈間隔300ms反轉電平
- print每隔2s串口打印任務
int fputc(int ch, FILE* fp) { while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE) != SET); huart1.Instance->DR = ch & 0XFF; return ch; } void* led1_task(UINT32 arg) { for(;;) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); LOS_TaskDelay(1000); } } void* led2_task(UINT32 arg) { for(;;) { HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); LOS_TaskDelay(300); } } void* print_task(UINT32 arg) { for(;;) { PRINTK("Hello LiteOS !\r\n"); LOS_TaskDelay(2000); } } UINT32 led1_task_handle; UINT32 led2_task_handle; UINT32 print_task_handle; int main(void) { TSK_INIT_PARAM_S task_param; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); LOS_KernelInit(); task_param.pcName = "led1_task"; task_param.pfnTaskEntry = led1_task; task_param.uwStackSize = 512; task_param.usTaskPrio = 4; if(LOS_TaskCreate(&led1_task_handle, &task_param) != LOS_OK) { PRINT_ERR("create led1 task failed!\r\n"); } task_param.pcName = "led2_task"; task_param.pfnTaskEntry = led2_task; task_param.uwStackSize = 512; task_param.usTaskPrio = 4; if(LOS_TaskCreate(&led2_task_handle, &task_param) != LOS_OK) { PRINT_ERR("create led2 task failed!\r\n"); } task_param.pcName = "print_task"; task_param.pfnTaskEntry = print_task; task_param.uwStackSize = 512; task_param.usTaskPrio = 4; if(LOS_TaskCreate(&print_task_handle, &task_param) != LOS_OK) { PRINT_ERR("create print task failed!\r\n"); } LOS_Start(); for(;;) { } }
ends…