网上基于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. 【LeetCode-128】Longest Consecutive Sequence

    描述 输入一个乱序的连续数列,输出其中最长连续数列长度,要求算法复杂度为 O(n) . 输入 54,55,300,12,56 输出 3 通常我们看有没有连续序列时 找某个数有没有的前后的数,比如看到5 ...

  2. 二、DBMS_JOB(用于安排和管理作业队列)

    1.概述 作用:用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务注意:当使用DBMS_LOB管理作业时,必须确保设置了初始化参数job_queue_processes( ...

  3. 用国内镜像源pip加速安装模块

    记住,如果使用了virtualenv,一定要先workon进入虚拟环境再执行包安装命令. pip install -i https://pypi.douban.com/simple/ 模块名(如:dj ...

  4. 【前端工具】 在 Windows 下安装 GruntJS——教程(译)

    在你安装 Grunt.js 之前你需要先安装 Node.js.对于本教程而言,我已经安装好了 node.js v0.10.0. 我将要安装 Grunt.js v0.4.1.警告:如果你已经安装了 Gr ...

  5. C语言实现的矩阵乘法运算器

    需求 编写程序模拟矩阵乘法,一个m*n的矩阵,乘以一个 n*m 的矩阵, 并且输出结果. STEP 1  矩阵乘法的计算 一个m行n列的矩阵与一个n行p列的矩阵可以相乘,得到的结果是一个m行p列的矩阵 ...

  6. TableviewCell嵌套TextView自动换行

    TableviewCell嵌套TextView自动换行 欢迎到github上去下载源码Demo, github链接:https://github.com/mengzhihun6 效果图:

  7. Alpha冲刺(2/10)

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/9960487.html 作业博客:https://edu.cnblogs.com/campus/ ...

  8. 剑指offer--49.矩阵中的路径

    时间限制:1秒 空间限制:32768K 热度指数:156998 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩 ...

  9. 几种常见的微服务架构方案——ZeroC IceGrid、Spring Cloud、基于消息队列、Docker Swarm

    微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...

  10. Java中关于内存泄漏出现的原因以及如何避免内存泄漏

    转账自:http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静 ...