云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 使用IAR移植ucos到stm32的步骤

使用IAR移植ucos到stm32的步骤

  • 62 次阅读
  • 3 次下载
  • 2026/4/23 10:40:56

选择链接配置文件

最后配置一下仿真,就此完成。

移植配置

由于这个版本是官方已经移植好的,我们所需要修改的东西很少只有两个地方。 打开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) {

搜索更多关于: 使用IAR移植ucos到stm32的步骤 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

选择链接配置文件 最后配置一下仿真,就此完成。 移植配置 由于这个版本是官方已经移植好的,我们所需要修改的东西很少只有两个地方。 打开startup_stm32f10x_hd.s(注意要去掉文件默认的只读属性,否则修改不成功) 把所有出现PendSV_Handler的地方替换成OS_CPU_PendSVHandler 把所有出现SysTick_Handler的地方替换成OS_CPU_SysTickHandler 之所以要修改这两个地方,是因为我们一般的中断向量用的是CMSIS给的,而ucos的中断向量是自己写的,我们修改CMSIS的向量表来统一这两个向量这种方法最简单,当然你也可以,修改ucos系统的函数名,这种方法我没有试,不过我见过另一个同事这么修改的也成功了(我不推荐这种方法,因为不知道修改

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com