[其他ST产品]

移植RTOS到不同架构的微控制器是一个有趣且富有挑战的过程

[复制链接]
577|2
手机看帖
扫描二维码
随时随地手机跟帖
米多0036|  楼主 | 2024-6-11 15:50 | 显示全部楼层 |阅读模式
从Cortex-M3移植到Cortex-M0的过程中遇到的问题很有代表性
工作内容和移植步骤
使用STM32Cube生成基础工程:

使用STM32CubeMX或STM32CubeIDE生成基础工程是一个好方法,可以快速配置外设和生成初始化代码。
中断优先级的配置:

中断优先级配置对于RTOS来说至关重要,特别是SysTick和PendSV中断。要确保正确设置它们的优先级,通常SysTick的优先级设置为最低优先级。
c
复制代码
HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
任务栈及任务控制块的建立:

每个任务需要分配独立的栈空间,任务控制块(TCB)通常包含任务的上下文信息,如栈指针、任务状态等。
PendSV_Handler函数的实现:

这是RTOS的核心,用于任务上下文切换。Cortex-M0和Cortex-M3在这里的区别主要在于汇编指令集。
asm
复制代码
.thumb_func
.global PendSV_Handler
PendSV_Handler:
    // 保存上下文
    MRS R0, PSP
    STMDB R0!, {R4-R11}
    // 更新PSP指针
    LDR R1, =currentTask
    LDR R2, [R1]
    STR R0, [R2]

    // 恢复上下文
    LDR R2, [R1, #4]
    LDR R0, [R2]
    LDMIA R0!, {R4-R11}
    MSR PSP, R0
    BX LR
SysTick_Handler函数的实现:

SysTick_Handler用于定时器中断,可以用来进行任务调度。
asm
复制代码
.thumb_func
.global SysTick_Handler
SysTick_Handler:
    // 增加系统时间
    // 调用调度器
    LDR R0, =osScheduler
    BLX R0
    BX LR
抢占式调度:

通过SysTick中断触发任务调度,可以使用PendSV中断进行上下文切换,从而实现抢占式调度。
队列传输:

队列是RTOS中的一个重要组件,用于任务间通信。可以在RTOS中实现简单的队列机制,保证数据的安全传输。

使用特权

评论回复
米多0036|  楼主 | 2024-6-11 15:51 | 显示全部楼层
注意事项和常见坑
中断优先级配置:

Cortex-M0和Cortex-M3在中断优先级配置上有一些不同,Cortex-M0只有4级中断优先级,而Cortex-M3有更细的优先级设置。一定要确保在使用库函数配置中断优先级时正确设置。
c
复制代码
HAL_NVIC_SetPriority(SysTick_IRQn, 3, 0);
HAL_NVIC_SetPriority(PendSV_IRQn, 3, 0);
汇编指令差异:

Cortex-M0使用的是Thumb指令集,而Cortex-M3支持Thumb-2指令集。确保在编写汇编代码时使用正确的指令集,并注意指令的不同之处。
使用延时函数:

在使用延时函数时要小心,特别是在RTOS中,因为它们可能会影响系统的调度。通常RTOS会提供自己的延时函数,如vTaskDelay()。

使用特权

评论回复
米多0036|  楼主 | 2024-6-11 15:52 | 显示全部楼层
具体实现代码示例
以下是一个简单的基于Cortex-M0的RTOS上下文切换的汇编实现示例:

asm
复制代码
    .thumb
    .thumb_func

    .global PendSV_Handler
    PendSV_Handler:
        MRS     R0, PSP                     // 获取当前进程栈指针
        STMDB   R0!, {R4-R11}               // 将寄存器保存到栈中
        LDR     R1, =currentTask
        LDR     R2, [R1]
        STR     R0, [R2]                    // 保存当前任务的栈指针

        LDR     R2, [R1, #4]                // 获取下一个任务的栈指针
        LDR     R0, [R2]
        LDMIA   R0!, {R4-R11}               // 恢复寄存器
        MSR     PSP, R0                     // 更新进程栈指针
        BX      LR                          // 返回
对于Cortex-M0和M3的差异以及注意事项:

优先级配置:确保使用正确的库函数配置中断优先级。
汇编指令:在Cortex-M0中使用16位的Thumb指令集,注意与Cortex-M3的Thumb-2指令集的差异。
调试:使用合适的调试工具,逐步调试每个模块,以确保正确性。
通过这些步骤和注意事项,你可以成功地将RTOS移植到不同的Cortex-M系列内核上,并解决遇到的问题。

使用特权

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

本版积分规则

80

主题

1189

帖子

0

粉丝