硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2603|回复: 2
收起左侧

[μCOS-III] ucos-III v3.07.03移植到stm32F103:非官方移植标准流程

[复制链接]

19

主题

373

回帖

430

积分

高级会员

积分
430
发表于 2020-2-26 00:46:50 | 显示全部楼层 |阅读模式
搞了一段时间,由于ucos官方的重新定义了初始化SysTick的流程和Non Kernel Aware的应用,导致用cubemx产生的启动代码 + ucos官方移植文件会产生很多问题,大部分会死在OSTimeDly,也就是systick和ts不正常。本人经过实践,摸索出cubemx + ucos官方移植文件完美结合的方法,在坛子里好像没人用过这样的思路,特地分享如下,欢迎大家讨论。

好处:非常简单,改动很小,通俗易懂,通用性强,最大限度利用cubemx的开机启动流程(HAL_Init() + SystemClock_Config()), 不用修改任何启动文件,比如替换OS_CPU_PendSVHandler,OS_CPU_SysTickHandler等,用原装的就行。

例子:IARv8.40 + Cubemx5.6.0

int main (void)
{
        OS_ERR err;
        CPU_FNCT_VOID  *p_ram_vect_tbl;

        //
       HAL_Init ();                                // HAL 库初始化,使用默认内部时钟 HSI= 8M
                                                        // SystemCoreClock 变量的初始化默认值
                                                        // 第一次调用 HAL_InitTick()
        SystemClock_Config ();           // 设置实际的 PLL 系统时钟,更新 SystemCoreClock 变量
                                                       // 如果不成功,使用默认内部时钟,不更新 SystemCoreClock 变量
                                                       // 第二次调用 HAL_InitTick()
        HAL_SuspendTick ();               // 禁止 SysTick 中断
        BSP_IntInit();                          // 初始化内存中断向量表

        HAL_NVIC_SetPriorityGrouping (0);                 // 优先级重新分组

        p_ram_vect_tbl = (CPU_FNCT_VOID *)CPU_REG_SCB_VTOR;
        p_ram_vect_tbl[CPU_INT_PENDSV] = OS_CPU_PendSVHandler;                // 重置 PendSVHandler 中断向量表
        p_ram_vect_tbl[CPU_INT_SYSTICK] = OS_CPU_SysTickHandler;                // 重置 SysTickHandler 中断向量表

        BSP_OS_TickInit ();                  // 用 ucos III 方式初始化 Systick,需要在启动任务中开启
        Mem_Init ();                             // 初始化内存管理模块
        CPU_IntDis();                           // 关全局中断
        CPU_Init ();                              // 初始化 uC/CPU 服务

        OSInit (&err);                           // 初始化 uC/OS-III

        。。。
        以下为官方正常流程
        。。。
}

在bsp_os.c文件:
1. 注释掉 HAL_InitTick(),也就是使用cubemx原装的版本
2. 修改HAL_GetTick()添加一个控制变量
uint32_t  HAL_GetTick (void)
{
    extern __IO uint32_t uwTick;
    CPU_INT32U  os_tick_ctr;

    // ucos III SysTick 初始化之后
    if (get_tick_control) {
#if (OS_VERSION >= 30000u)
      OS_ERR      os_err;
#endif

#if (OS_VERSION >= 30000u)
      os_tick_ctr = OSTimeGet(&os_err);
#else
      os_tick_ctr = OSTimeGet();
#endif
    // ucos III SysTick 初始化之前
    } else {
      os_tick_ctr = uwTick;
    }

    return os_tick_ctr;
}

完毕!!!

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-2-26 10:22:21 | 显示全部楼层
非常感谢楼主分享。
回复

使用道具 举报

19

主题

373

回帖

430

积分

高级会员

积分
430
 楼主| 发表于 2020-2-26 21:36:02 | 显示全部楼层
技术交流哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 02:27 , Processed in 0.146466 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表