基于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…