打印
[应用相关]

基于STM32使用HAL库手把手移植华为LiteOS系统

[复制链接]
1061|57
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zljiu|  楼主 | 2021-6-8 16:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
(一)说明

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

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


使用特权

评论回复
沙发
zljiu|  楼主 | 2021-6-8 16:49 | 只看该作者
(二)裸机工程创建

使用STM32CubeMX创建裸机工程:

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


使用特权

评论回复
板凳
zljiu|  楼主 | 2021-6-8 16:50 | 只看该作者

配置调试串口1:


使用特权

评论回复
地板
zljiu|  楼主 | 2021-6-8 16:51 | 只看该作者
配置两个LED灯:

使用特权

评论回复
5
zljiu|  楼主 | 2021-6-8 16:52 | 只看该作者

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



使用特权

评论回复
6
zljiu|  楼主 | 2021-6-8 16:53 | 只看该作者

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



使用特权

评论回复
7
zljiu|  楼主 | 2021-6-8 16:53 | 只看该作者

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


最后输出工程即可!



使用特权

评论回复
8
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中)


使用特权

评论回复
9
zljiu|  楼主 | 2021-6-8 16:57 | 只看该作者

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


使用特权

评论回复
10
zljiu|  楼主 | 2021-6-8 16:58 | 只看该作者
添加头文件包含,如下图所示:


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

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


使用特权

评论回复
11
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(;;)
        {
        }
}


使用特权

评论回复
12
便携手到老| | 2021-6-8 17:39 | 只看该作者
这个可以呀,不错,新鲜的。

使用特权

评论回复
13
macpherson| | 2022-12-4 21:02 | 只看该作者
这个有完整的移植教程的吗?              

使用特权

评论回复
14
MessageRing| | 2022-12-6 14:07 | 只看该作者
能分享下工程文件吗?

使用特权

评论回复
15
Stahan| | 2022-12-6 15:16 | 只看该作者
这个有完整点的教程吗?

使用特权

评论回复
16
1988020566| | 2022-12-6 15:22 | 只看该作者
占用多大的内存呢              

使用特权

评论回复
17
Henryko| | 2022-12-6 15:41 | 只看该作者
这个帖子不是已经很详细了

使用特权

评论回复
18
beacherblack| | 2022-12-12 12:12 | 只看该作者
STM32CubeMX是否可以生成相关的代码呢?

使用特权

评论回复
19
louliana| | 2022-12-15 13:33 | 只看该作者
华为的物联网操作系统 Liteos

使用特权

评论回复
20
wengh2016| | 2022-12-15 15:13 | 只看该作者
组件是Huawei LiteOS系统的组成部分

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

3319

帖子

3

粉丝