当前位置:首页 > 使用IAR移植ucos到stm32的步骤
选择链接配置文件
最后配置一下仿真,就此完成。
移植配置
由于这个版本是官方已经移植好的,我们所需要修改的东西很少只有两个地方。 打开startup_stm32f10x_hd.s(注意要去掉文件默认的只读属性,否则修改不成功) 把所有出现PendSV_Handler的地方替换成OS_CPU_PendSVHandler 把所有出现SysTick_Handler的地方替换成OS_CPU_SysTickHandler
之所以要修改这两个地方,是因为我们一般的中断向量用的是CMSIS给的,而ucos的中断向量是自己写的,我们修改CMSIS的向量表来统一这两个向量这种方法最简单,当然你也可以,修改ucos系统的函数名,这种方法我没有试,不过我见过另一个同事这么修改的也成功了(我不推荐这种方法,因为不知道修改ucos函数调用复杂,修改以后可能会编译出错,有心情的可以试一下)。
当然也有网上别人的移植教程是重写void OS_CPU_SysTickHandler(void); void OS_CPU_SysTickInit(void);两个函数,同时替换了PendSV_Handler。这种方法也可以。 具体再深一步的话要研究这几个函数在系统中的作用,可以参见邵老师的书或者百度,这里不多说了(因为我说不明白-_-!)。
编译一下,咦发现出错了,仔细研究发现是因为core_cm3.h中的函数声明和intrinsics.h中的函数声明重复了,这里把1049行#elif (defined (__ICCARM__)) 直接修改#elif (defined (__ICCARM__USR)) 不让编译器编译。 还要修改os_cfg.h中的
#define OS_APP_HOOKS_EN 0 /* Application-defined hooks are called from the uC/OS-II hooks*/
#define OS_ARG_CHK_EN 0 /*Enable (1) or Disable (0) argument checking */
#define OS_TMR_EN 0 /* Enable (1) or Disable (0) code generation for TIMERS */ 三个地方,这些功能我们暂时不用,要用的话要定义一些东西,这里不做介绍,参见邵老师的书吧。
还缺少一个函数定义如下
INT32U OS_CPU_SysTickClkFreq(void) {
RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
return ((INT32U)rcc_clocks.HCLK_Frequency); //return SYSCLK_FREQ_72MHz; }
这个函数主要是用来获得cpu频率,用来确定系统滴答的时间。如果知道系统时钟是多少可以不用这么复杂,直接
INT32U OS_CPU_SysTickClkFreq(void) {
return 72000000; }
也可以。
当然还有个错误是缺少main函数,下面我们就来写。
首先把app_cfg.h所有内容删掉替换成下面的(因为这个文件是借鉴的下面要自己写了) #ifndef __APP_CFG_H__ #define __APP_CFG_H__
/* task stack size */
#define STARTUP_TASK_STK_SIZE 128 #define TASK1_STK_SIZE 128 #define TASK2_STK_SIZE 128 #define TASK3_STK_SIZE 128 #define TASK4_STK_SIZE 128
/* task priority */
#define STARTUP_TASK_PRIO 4 #define TASK1_PRIO 5 #define TASK2_PRIO 6 #define TASK3_PRIO 7 #define TASK4_PRIO 8 #endif
这个文件主要就是每个任务的优先级和堆栈大小。
我们建立5个任务,其中一个是启动任务,其余四个分别闪一个led等。代码如下。 #include \#include \
OS_STK startup_stk[STARTUP_TASK_STK_SIZE]; OS_STK task1_stk[TASK1_STK_SIZE]; OS_STK task2_stk[TASK2_STK_SIZE]; OS_STK task3_stk[TASK3_STK_SIZE]; OS_STK task4_stk[TASK4_STK_SIZE]; u8 os_err;
static void task1(void *p_arg) {
for (;;) {
GPIO_WriteBit(GPIOA,GPIO_Pin_4 ,Bit_SET); OSTimeDly(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_4 ,Bit_RESET); OSTimeDly(500); } }
static void task2(void *p_arg) {
for (;;) {
GPIO_WriteBit(GPIOA,GPIO_Pin_5 ,Bit_SET); OSTimeDly(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_5 ,Bit_RESET); OSTimeDly(500); } }
static void task3(void *p_arg) {
for (;;) {
GPIO_WriteBit(GPIOA,GPIO_Pin_6 ,Bit_SET); OSTimeDly(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_6 ,Bit_RESET); OSTimeDly(500); } }
static void task4(void *p_arg) {
共分享92篇相关文档