[应用相关] 基于STM32使用HAL库手把手移植华为LiteOS系统

[复制链接]
3026|57
 楼主| zljiu 发表于 2021-6-8 16:49 | 显示全部楼层 |阅读模式
(一)说明

本章节实验工程源码下载:https://github.com/wowyyy/STM32_LiteOS_Demo

华为LiteOS内核源码下载地址:https://github.com/LiteOS/LiteOS,选择develop分支下载。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxMTUzNDcxNTAz,size_16,color_FFFFFF,t_70#pic_center.jpg


 楼主| zljiu 发表于 2021-6-8 16:49 | 显示全部楼层
(二)裸机工程创建

使用STM32CubeMX创建裸机工程:

这里我是用的芯片是STM32F103RBT6,时钟主频为72MHz,配置时钟树:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxMTUzNDcxNTAz,size_16,color_FFFFFF,t_70#pic_center.jpg


 楼主| zljiu 发表于 2021-6-8 16:50 | 显示全部楼层

配置调试串口1:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxMTUzNDcxNTAz,size_16,color_FFFFFF,t_70#pic_center.jpg


 楼主| zljiu 发表于 2021-6-8 16:51 | 显示全部楼层
配置两个LED灯:
2822660bf2faf237a2.png
 楼主| zljiu 发表于 2021-6-8 16:52 | 显示全部楼层

由于LiteOS使用系统嘀嗒定时器当作心跳,HAL库也使用了这个定时器,所以我们将HAL库的定时器改为其他,这里我该为了定时器4:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxMTUzNDcxNTAz,size_16,color_FFFFFF,t_70#pic_center.jpg



 楼主| zljiu 发表于 2021-6-8 16:53 | 显示全部楼层

配置中断,这里我选择了组4,也就是全部为抢占优先级:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxMTUzNDcxNTAz,size_16,color_FFFFFF,t_70#pic_center.jpg



 楼主| zljiu 发表于 2021-6-8 16:53 | 显示全部楼层

取消掉以下两个中断服务函数的生成,因为ListOS已经实现了这两个函数:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxMTUzNDcxNTAz,size_16,color_FFFFFF,t_70#pic_center.jpg
最后输出工程即可!



 楼主| zljiu 发表于 2021-6-8 16:55 | 显示全部楼层
(三)移植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中)


 楼主| zljiu 发表于 2021-6-8 16:57 | 显示全部楼层

在Keil中添加源码,如下图所示:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxMTUzNDcxNTAz,size_16,color_FFFFFF,t_70#pic_center.jpg


 楼主| zljiu 发表于 2021-6-8 16:58 | 显示全部楼层
添加头文件包含,如下图所示:

4906060bf30f528a24.png
修改OS_CONFIG/target_config.h文件,找到BOARD_SRAM_SIZE_KB宏,此宏定义了SRAM(内存)的大小,STM32F103RB是20K,所以此处改为20。

修改宏LOSCFG_PLATFORM_HWI为NO。此宏控制着系统中断的管理方式,为NO表示系统中断不被系统管理,为YES表示系统接管中断。STM32的中断管理已经很好了不需要系统接管。


 楼主| zljiu 发表于 2021-6-8 16:59 | 显示全部楼层
(四)系统运行测试

这里创建了三个任务:

led1灯间隔1s反转电平
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(;;)
        {
        }
}


便携手到老 发表于 2021-6-8 17:39 | 显示全部楼层
这个可以呀,不错,新鲜的。
macpherson 发表于 2022-12-4 21:02 | 显示全部楼层
这个有完整的移植教程的吗?              
MessageRing 发表于 2022-12-6 14:07 | 显示全部楼层
能分享下工程文件吗?
Stahan 发表于 2022-12-6 15:16 | 显示全部楼层
这个有完整点的教程吗?
1988020566 发表于 2022-12-6 15:22 | 显示全部楼层
占用多大的内存呢              
Henryko 发表于 2022-12-6 15:41 | 显示全部楼层
这个帖子不是已经很详细了
beacherblack 发表于 2022-12-12 12:12 | 显示全部楼层
STM32CubeMX是否可以生成相关的代码呢?
louliana 发表于 2022-12-15 13:33 | 显示全部楼层
华为的物联网操作系统 Liteos
wengh2016 发表于 2022-12-15 15:13 | 显示全部楼层
组件是Huawei LiteOS系统的组成部分
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

3327

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部