网上基于MDK的移植数不胜数,但是基于IAR的移植几乎没有,因为官方的例程就是基于IAR的,所以移植起来很简单,没人介绍,但还是得小心谨慎,一不小心就出错,对于新手来说,查找错误可不是那么容易的。IAR建立工程,这里就不介绍。
以下红色部分需要与MCU型号对应
(1)在官网下载适合自己STM32的uCOS-II库,连接如下,我用的MCU是STM32F103VCT6,属于大容量的,所以选择的库是STMicroelectronics STM32F103ZE。
(2)下载下来的是(.exe)文件,双击解压得到名称为Micrium的文件夹。
(3)在自己的工程中建立文件夹ucosii,里面包含3个子文件夹,分别是config,port,source,文件夹名称随意。
(4)将文件夹Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\IAR中的文件全部复制到port文件夹中。
   将文件夹Micrium\Software\uCOS-II\Source中的文件全部复制到source文件夹中。
   将文件夹Micrium\Software\EvalBoards\ST\STM3210E-EVAL\IAR\OS-Probe中的app_cfg.h和os_cfg.h复制到config文件夹中。
   (STM3210E-EVAL此目录根据STM型号而定,型号不相符是否有影响,未测试)
(5)为了防止修改错误,这里暂时可以将port和source这两个文件夹中的文件设置为只读,以后用的时候再取消。
(6)修改os_cfg.h中的第一个宏定义为#define OS_APP_HOOKS_EN    0  (取消钩子函数)。
(7)将启动程序startup_stm32f10x_hd.s中所有PendSV_Handler替换成OS_CPU_PendSVHandler,SysTick_Handler替换成OS_CPU_SysTickHandler。
注意:下面这种注释是错误的,会导致进入硬件错位中断,害的我浪费了好几天时间。
   PUBWEAK OS_CPU_PendSVHandler;PendSV_Handler

SECTION
.text:CODE:REORDER(1)
OS_CPU_PendSVHandler;PendSV_Handler
        B OS_CPU_PendSVHandler;PendSV_Handler

PUBWEAK OS_CPU_SysTickHandler;SysTick_Handler
        SECTION .text:CODE:REORDER(1)
OS_CPU_SysTickHandler;SysTick_Handler
        B OS_CPU_SysTickHandler;SysTick_Handler

(8)打开Micrium\Software\EvalBoards\ST\STM3210E-EVAL\IAR\BSP\bsp.c文件,复制函数CPU_INT32U  BSP_CPU_ClkFreq (void)和INT32U  OS_CPU_SysTickClkFreq
(void)到main.c中。
   (注意将所有CPU_INT32U修改为INT32U,不然会报错)
(9)在main.c中创建任务。
  1. #include "ucos_ii.h"
  2. #include "os_cpu.h"
  3. #include "stm32f10x.h"
  4.  
  5. #define STARTUP_TASK_PRIO 10
  6. #define STARTUP_TASK_STK_SIZE 64
  7. OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];
  8.  
  9. //LED1任务
  10. //设置任务优先级
  11. #define LED1_TASK_PRIO 5
  12. //设置任务堆栈大小
  13. #define LED1_STK_SIZE 64
  14. //创建任务堆栈空间
  15. OS_STK LED1_TASK_STK[LED1_STK_SIZE];
  16.  
  17. //LED2任务
  18. //设置任务优先级
  19. #define LED2_TASK_PRIO 6
  20. //设置任务堆栈大小
  21. #define LED2_STK_SIZE 64
  22. //创建任务堆栈空间
  23. OS_STK LED2_TASK_STK[LED2_STK_SIZE];
  24.  
  25. void led1_task(void *p_arg);
  26. void led2_task(void *p_arg);
  27.  
  28. INT32U OS_CPU_SysTickClkFreq (void)
  29. {
  30. INT32U freq;
  31.  
  32. RCC_ClocksTypeDef rcc_clocks;
  33.  
  34. RCC_GetClocksFreq(&rcc_clocks);
  35.  
  36. freq = (INT32U)rcc_clocks.HCLK_Frequency;
  37.  
  38. return (freq);
  39. }
  40.  
  41. void LED_Init(void)
  42. {
  43.  
  44. GPIO_InitTypeDef GPIO_InitStructure;
  45.  
  46. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能PB,PE端口时钟
  47. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED0-->PA.2 端口配置
  48. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  49. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  50. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.2
  51. GPIO_ResetBits(GPIOA,GPIO_Pin_2); //PA.2 输出高
  52.  
  53. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //LED1-->PB.12 端口配置, 推挽输出
  54. GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
  55. GPIO_ResetBits(GPIOB,GPIO_Pin_12); //PB.12 输出高
  56. }
  57.  
  58. static void startup_task(void *p_arg)
  59. {
  60. INT8U err;
  61. OS_CPU_SR cpu_sr=0;
  62.  
  63. OS_CPU_SysTickInit();
  64.  
  65. #if (OS_TASK_STAT_EN > 0)
  66. OSStatInit();
  67. #endif
  68.  
  69. OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
  70.  
  71. err = OSTaskCreate(led1_task, (void *)0,
  72. (OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1], LED1_TASK_PRIO);
  73. err = OSTaskCreate(led2_task, (void *)0,
  74. (OS_STK*)&LED2_TASK_STK[LED2_STK_SIZE-1], LED2_TASK_PRIO);
  75.  
  76. OSTaskSuspend(STARTUP_TASK_PRIO); //挂起起始任务.
  77. OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
  78.  
  79. if (OS_ERR_NONE != err)
  80. while(1);
  81.  
  82. OSTaskDel(OS_PRIO_SELF);
  83. }
  84.  
  85. int main(void)
  86. {
  87. LED_Init();
  88. OSInit();
  89. OSTaskCreate(startup_task, (void *)0,
  90. (OS_STK*)&startup_task_stk[STARTUP_TASK_STK_SIZE-1],
  91. STARTUP_TASK_PRIO);
  92. OSStart();
  93. return 0;
  94. }
  95.  
  96. //LED1任务
  97. void led1_task(void *p_arg)
  98. {
  99. while(1)
  100. {
  101. GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  102. OSTimeDly(500);
  103. GPIO_SetBits(GPIOA,GPIO_Pin_2);
  104. OSTimeDly(500);
  105. }
  106. }
  107.  
  108. //LED2任务
  109. void led2_task(void *p_arg)
  110. {
  111. while(1)
  112. {
  113. GPIO_ResetBits(GPIOB,GPIO_Pin_12);
  114. OSTimeDly(500);
  115. GPIO_SetBits(GPIOB,GPIO_Pin_12);
  116. OSTimeDly(500);
  117. }
  118. }

基于IAR和STM32的uCOS-II移植的更多相关文章

  1. 基于ZigBee和STM32的智能家居控制系统的设计与实现(三)

    基于ZigBee和STM32的智能家居控制系统的设计与实现(三) 自从前两篇博客介绍了智能家居系统的基本实现机理后,收到了好多朋友的来信,和我讨论了好多的这方面的知识,在此很高兴,虽然自己做的这个所谓 ...

  2. ucos ii 百度官方介绍

          μC/OS II(Micro-Controller Operating System Two)是一个可以基于ROM运行的.可裁剪的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处 ...

  3. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    DE1-SOC开发板上搭建NIOS II处理器运行UCOS II   今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...

  4. 基于s5pv210嵌入式linux系统sqlite3数据库移植

    基于s5pv210嵌入式linux系统sqlite3数据库移植 1.下载源码 http://www.sqlite.org/download.html 最新源码为3080100 2.解压 tar xvf ...

  5. 基于Petri网的工作流分析和移植

    基于Petri网的工作流分析和移植 一.前言 在实际应用场景,包括PEC的订单流程从下订单到订单派送一直到订单完成都是按照一系列预先规定好的工作流策略进行的. 通常情况下如果是采用面向过程的编程方法, ...

  6. ucos ii 46个系统API函数解析

    源: ucos ii 46个系统API函数解析

  7. FreeRTOS 和uCOS II的简单比较

    转载:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=114 这是两种RTOS, 现在粗略比较一下. freeRTOS比uCO ...

  8. 基于IAR平台FreeRTOS移植

     开始这篇文章之前先简单说明一下,我使用的MCU是我们公司自主研发的ACH1180芯片,和STM32差不多,都是Cortex-M4的核,所以移植的过程参考了STM32移植的步骤. 1.解压FreeRT ...

  9. IAR为STM32创建工程模板(基于STM32f103zet6)

    今天给小伙伴分享一篇给stm32新建工程模版 1.首先打开IAR,就是这个样子 2.再建一个目录文件夹 3.建立一个工作空间,以及建好工作空间如右图所示 4.接下来建立工程,Project------ ...

随机推荐

  1. nyoj151——中国剩余定理

    生理周期 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 142220   Accepted: 45744 Descripti ...

  2. RedHat/CentOS 7通过nmcli命令管理网络教程

    Red Hat Enterprise Linux 7 和CentOS 7 的网络管理实际上是对NetworkManager的管理,可通过nmcli命令进行控制,下面小编就给大家介绍下RedHat/Ce ...

  3. 【Python】什么是闭包

    文章转载自:点这里 在 Python 中很多教材都没有提及什么是闭包,但在定义一个 Decorator 时,就已经用到闭包了.如果不理解什么是闭包,则不可能清晰掌握Decorator 装饰器. 要形成 ...

  4. Spring实例化bean的几种方式

    一,通过constructor实例化bean Spring可以实例化各种类型的类,不要求必须是JavaBean类型的类.在XML中配置类如下: <bean id="exampleBea ...

  5. Linux:运行级别,root密码重置,救援模式,安装图形化界面

    运行级别,root密码重置,救援模式,安装图形界面 运行级别 1.查看当前系统的运行级别 runlevel 2.认识各个运行级别以及开机自启运行级别 Linux系统运行级别共7个执行 vi /etc/ ...

  6. [AirFlow]AirFlow使用指南二 DAG定义文件

    1. Example """ Code that goes along with the Airflow tutorial located at: https://git ...

  7. index、noindex、follow、nofollow的使用说明

    爬虫是目前最常见的网络程序,曾经有过统计,说是目前的网络流量有一半以上是爬虫使用的.虽然爬虫程序随处可见,但是并不代表这种做法就是合理合法的. 在抓取网页时,我们要让自己的爬虫遵守Robot.txt协 ...

  8. swift metal ios8 关键字.

    swift metal ios8  关键字. 4000API. 无所谓谁打败谁吧. 行业内用户用的多 资源多 问题容易解决. 今年明显unity 火热程度非常. 然,万变不离其中. 对于游戏产品来说, ...

  9. HttpUrlConnection使用Get和Post访问服务器的工具类(一)

    首先我们有一个返回响应的接口HttpCallBackListener public interface HttpCallbackListener { void onFinish(String resp ...

  10. js之购物车案例

      这里主要提供思路: 一共两个页面通过原生来实现,我们需要对cookie进行封装. 在商品列表页,我们将点击添加的商品放入一个对象中,而后将该对象放入数组中,一个对象可以说就是一个商品.在购物车页面 ...