网上基于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中创建任务。
#include "ucos_ii.h"
#include "os_cpu.h"
#include "stm32f10x.h" #define STARTUP_TASK_PRIO 10
#define STARTUP_TASK_STK_SIZE 64
OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE]; //LED1任务
//设置任务优先级
#define LED1_TASK_PRIO 5
//设置任务堆栈大小
#define LED1_STK_SIZE 64
//创建任务堆栈空间
OS_STK LED1_TASK_STK[LED1_STK_SIZE]; //LED2任务
//设置任务优先级
#define LED2_TASK_PRIO 6
//设置任务堆栈大小
#define LED2_STK_SIZE 64
//创建任务堆栈空间
OS_STK LED2_TASK_STK[LED2_STK_SIZE]; void led1_task(void *p_arg);
void led2_task(void *p_arg); INT32U OS_CPU_SysTickClkFreq (void)
{
INT32U freq; RCC_ClocksTypeDef rcc_clocks; RCC_GetClocksFreq(&rcc_clocks); freq = (INT32U)rcc_clocks.HCLK_Frequency; return (freq);
} void LED_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED0-->PA.2 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.2
GPIO_ResetBits(GPIOA,GPIO_Pin_2); //PA.2 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //LED1-->PB.12 端口配置, 推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //PB.12 输出高
} static void startup_task(void *p_arg)
{
INT8U err;
OS_CPU_SR cpu_sr=0; OS_CPU_SysTickInit(); #if (OS_TASK_STAT_EN > 0)
OSStatInit();
#endif OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断) err = OSTaskCreate(led1_task, (void *)0,
(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1], LED1_TASK_PRIO);
err = OSTaskCreate(led2_task, (void *)0,
(OS_STK*)&LED2_TASK_STK[LED2_STK_SIZE-1], LED2_TASK_PRIO); OSTaskSuspend(STARTUP_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) if (OS_ERR_NONE != err)
while(1); OSTaskDel(OS_PRIO_SELF);
} int main(void)
{
LED_Init();
OSInit();
OSTaskCreate(startup_task, (void *)0,
(OS_STK*)&startup_task_stk[STARTUP_TASK_STK_SIZE-1],
STARTUP_TASK_PRIO);
OSStart();
return 0;
} //LED1任务
void led1_task(void *p_arg)
{
while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
OSTimeDly(500);
GPIO_SetBits(GPIOA,GPIO_Pin_2);
OSTimeDly(500);
}
} //LED2任务
void led2_task(void *p_arg)
{
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
OSTimeDly(500);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
OSTimeDly(500);
}
}

基于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. 【MySQL】查看当前存储引擎

    一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你的mysql当前默认的存储引擎: m ...

  2. vue 全选多选

    html: //全选按钮 <li class="choice_fme"> <div @click="checkAll" v-bind:clas ...

  3. iOS自动化探索(九)使用Jenkins自动化打包并发布iOS App

    继前一篇: Mac环境下安装Jenkins Jenkins安装好后, 我们试着创建一个iOS自动打包并发布的任务 iOS App构建必须在MAC上面使用xcode进行,所以我们要安装下xcode集成插 ...

  4. Django开发BUG "Model class WH_auth.models.User doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS."

    当进行数据库迁移的时候发生问题,报错如下:RuntimeError: Model class WH_auth.models.User doesn't declare an explicit app_l ...

  5. 012——数组(十二) 数组range array_count_values array_pad array_product

    <?php /*range () 生成包含指定范围的数组,第三个参数是步长值 */ /*$arr=range(1,10,2); print_r($arr);//输出:Array ( [0] =& ...

  6. Markdown_02_作图

    [TOC] 前言 一.序列图(Sequence) 序列图由 js-sequence提供支持,可以将代码块转成序列图 示例如下: ```sequence Title: Here is a title A ...

  7. js 多个倒计时,毫秒倒计时

    其实主要是借鉴了了这篇文的写法(http://tuzwu.iteye.com/blog/819081),俺稍作了修改,以便更适合我的需要: 实现功能:调用一个函数,传入html元素的id,和一个截止时 ...

  8. New Concept English three (22)

    34w 54 Some plays are so successful that they run for years on end. In many ways, this is unfortunat ...

  9. Machine Learning|Andrew Ng|Coursera 吴恩达机器学习笔记(完结)

    Week 1: Machine Learning: A computer program is said to learn from experience E with respect to some ...

  10. [Linux] 虚拟环境的配置和使用 virtualenv

    1.安装 sudo apt-get install python-virtualenv 2.使用 创建虚拟环境: virtualenv [虚拟环境名称] 例如: virtualenv env_test ...