OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4643|回复: 0

uCOS-III v3.08移植到F103--非官方移植详细步骤

[复制链接]

4

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2019-5-15
在线时间
21 小时
发表于 2020-12-8 11:33:44 | 显示全部楼层 |阅读模式
由于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;
}

完成!!!


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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