初级会员
- 积分
- 70
- 金钱
- 70
- 注册时间
- 2019-5-15
- 在线时间
- 21 小时
|
由于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;
}
完成!!!
|
|