核心芯片使用STM32F407
1、源码
官网下载源码如下:

用到的主要在UCOS-II中的文件:

在工程中创建三个文件夹分别为ports、source、Config
(1)ports下IAR中的所有文件

(2)source中的所有文件

(3)Config中文件在官方里程中,只需要一个文件

2、文件修改
(1)修改os_cpu_a.asm
汇编语音,不了解,参考自正点原子

     IMPORT  OSRunning               ; External referencesIMPORT  OSPrioCurIMPORT  OSPrioHighRdyIMPORT  OSTCBCurIMPORT  OSTCBHighRdyIMPORT  OSIntNestingIMPORT  OSIntExitIMPORT  OSTaskSwHook   EXPORT  OSStartHighRdy               EXPORT  OSCtxSwEXPORT  OSIntCtxSwEXPORT  OS_CPU_SR_Save                                      ; Functions declared in this fileEXPORT  OS_CPU_SR_Restore       EXPORT  PendSV_Handler
NVIC_INT_CTRL       EQU     0xE000ED04  ; 中断控制寄存器
NVIC_SYSPRI2        EQU     0xE000ED22  ; 系统优先级寄存器(2)
NVIC_PENDSV_PRI     EQU         0xFFFF  ; PendSV中断和系统节拍中断; (都为最低,0xff).
NVIC_PENDSVSET      EQU     0x10000000  ; 触发软件中断的值.PRESERVE8    AREA    |.text|, CODE, READONLYTHUMB
OS_CPU_SR_SaveMRS     R0, PRIMASK   ;读取PRIMASK到R0,R0为返回值 CPSID   I              ;PRIMASK=1,关中断(NMI和硬件FAULT可以响应)BX      LR              ;返回
OS_CPU_SR_RestoreMSR     PRIMASK, R0        ;读取R0到PRIMASK中,R0为参数BX      LR              ;返回
;* 功能描述: 使用调度器运行第一个任务
OSStartHighRdyLDR     R4, =NVIC_SYSPRI2      ; set the PendSV exception priorityLDR     R5, =NVIC_PENDSV_PRISTR     R5, [R4]MOV     R4, #0                 ; set the PSP to 0 for initial context switch callMSR     PSP, R4LDR     R4, =OSRunning         ; OSRunning = TRUEMOV     R5, #1STRB    R5, [R4];切换到最高优先级的任务LDR     R4, =NVIC_INT_CTRL     ;rigger the PendSV exception (causes context switch)LDR     R5, =NVIC_PENDSVSETSTR     R5, [R4]CPSIE   I                      ;enable interrupts at processor level
OSStartHangB       OSStartHang            ;should never get here;* 功能描述: 任务级上下文切换
OSCtxSwPUSH    {R4, R5}LDR     R4, =NVIC_INT_CTRL      ;触发PendSV异常 (causes context switch)LDR     R5, =NVIC_PENDSVSETSTR     R5, [R4]POP     {R4, R5}BX      LR
;* 功能描述: 中断级任务切换
OSIntCtxSwPUSH    {R4, R5}LDR     R4, =NVIC_INT_CTRL      ;触发PendSV异常 (causes context switch)LDR     R5, =NVIC_PENDSVSETSTR     R5, [R4]POP     {R4, R5}BX      LRNOP
;* 功能描述: OSPendSV is used to cause a context switch.
PendSV_HandlerCPSID   I                                                   ; Prevent interruption during context switchMRS     R0, PSP              ; PSP is process stack pointer 如果在用PSP堆栈,则可以忽略保存寄存器,参考CM3权威中的双堆栈CBZ     R0, PendSV_Handler_Nosave                            ; Skip register save the first timeTST  R14, #0x10IT        EQVSTMDBEQ R0!, {S16-S31} SUBS    R0, R0, #0x20                                       ; Save remaining regs r4-11 on process stackSTM     R0, {R4-R11}LDR     R1, =OSTCBCur                                       ; OSTCBCur->OSTCBStkPtr = SP;LDR     R1, [R1]STR     R0, [R1]                                            ; R0 is SP of process being switched out
PendSV_Handler_NosavePUSH    {R14}                                               ; Save LR exc_return valueLDR     R0, =OSTaskSwHook                                   ; OSTaskSwHook();BLX     R0POP     {R14} LDR     R0, =OSPrioCur                                      ; OSPrioCur = OSPrioHighRdy;LDR     R1, =OSPrioHighRdyLDRB    R2, [R1]STRB    R2, [R0]LDR     R0, =OSTCBCur                                       ; OSTCBCur  = OSTCBHighRdy;LDR     R1, =OSTCBHighRdyLDR     R2, [R1]STR     R2, [R0]LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr;LDM     R0, {R4-R11}                                        ; Restore r4-11 from new process stackADDS    R0, R0, #0x20;Is the task using the FPU context? If so, push high vfp registers.TST   R14, #0x10IT        EQVLDMIAEQ R0!, {S16-S31} MSR     PSP, R0                                             ; Load PSP with new process SPORR     LR, LR, #0x04                                       ; Ensure exception return uses process stackCPSIE   IBX      LR                                                  ; Exception return will restore remaining contextNOPend

(2)修改os_cfg.h
#define OS_APP_HOOKS_EN 设置为0
(3)修改os_cpu_c.c
0)这个文件中的函数基本都空函数,其中OSTaskStkInit()函数是最重要的,其他函数如果报错屏蔽掉即可
1)修改OSTaskStkInit()函数,这个函数是堆栈函数,参考自正点原子,中间没有执行部分不知道为什么不可以屏蔽掉(死机)

OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{OS_STK *stk;(void)opt;    stk       = ptos;
#if (__FPU_PRESENT==1)&&(__FPU_USED==1) *(--stk) = (INT32U)0x00000000L; //No Name Register  *(--stk) = (INT32U)0x00001000L; //FPSCR*(--stk) = (INT32U)0x00000015L; //s15*(--stk) = (INT32U)0x00000014L; //s14*(--stk) = (INT32U)0x00000013L; //s13*(--stk) = (INT32U)0x00000012L; //s12*(--stk) = (INT32U)0x00000011L; //s11*(--stk) = (INT32U)0x00000010L; //s10*(--stk) = (INT32U)0x00000009L; //s9*(--stk) = (INT32U)0x00000008L; //s8*(--stk) = (INT32U)0x00000007L; //s7*(--stk) = (INT32U)0x00000006L; //s6*(--stk) = (INT32U)0x00000005L; //s5*(--stk) = (INT32U)0x00000004L; //s4*(--stk) = (INT32U)0x00000003L; //s3*(--stk) = (INT32U)0x00000002L; //s2*(--stk) = (INT32U)0x00000001L; //s1*(--stk) = (INT32U)0x00000000L; //s0
#endif*(stk)    = (INT32U)0x01000000L;             /* xPSR                                               */*(--stk)  = (INT32U)task;                    /* Entry Point                                        */*(--stk)  = (INT32U)OS_TaskReturn;           /* R14 (LR) (init value will cause fault if ever used)*/*(--stk)  = (INT32U)0x12121212L;             /* R12                                                */*(--stk)  = (INT32U)0x03030303L;             /* R3                                                 */*(--stk)  = (INT32U)0x02020202L;             /* R2                                                 */*(--stk)  = (INT32U)0x01010101L;             /* R1                                                 */*(--stk)  = (INT32U)p_arg;                   /* R0 : argument                                      */#if (__FPU_PRESENT==1)&&(__FPU_USED==1)   *(--stk) = (INT32U)0x00000031L; //s31*(--stk) = (INT32U)0x00000030L; //s30*(--stk) = (INT32U)0x00000029L; //s29*(--stk) = (INT32U)0x00000028L; //s28*(--stk) = (INT32U)0x00000027L; //s27*(--stk) = (INT32U)0x00000026L; //s26    *(--stk) = (INT32U)0x00000025L; //s25*(--stk) = (INT32U)0x00000024L; //s24*(--stk) = (INT32U)0x00000023L; //s23*(--stk) = (INT32U)0x00000022L; //s22*(--stk) = (INT32U)0x00000021L; //s21*(--stk) = (INT32U)0x00000020L; //s20*(--stk) = (INT32U)0x00000019L; //s19*(--stk) = (INT32U)0x00000018L; //s18*(--stk) = (INT32U)0x00000017L; //s17*(--stk) = (INT32U)0x00000016L; //s16
#endif*(--stk)  = (INT32U)0x11111111L;             /* R11                                                */*(--stk)  = (INT32U)0x10101010L;             /* R10                                                */*(--stk)  = (INT32U)0x09090909L;             /* R9                                                 */*(--stk)  = (INT32U)0x08080808L;             /* R8                                                 */*(--stk)  = (INT32U)0x07070707L;             /* R7                                                 */*(--stk)  = (INT32U)0x06060606L;             /* R6                                                 */*(--stk)  = (INT32U)0x05050505L;             /* R5                                                 */*(--stk)  = (INT32U)0x04040404L;             /* R4                                                 */return (stk);
}

2)将OS_CPU_SysTickInit()和OS_CPU_SysTickHandler()这两个函数屏蔽掉,改为自写的滴答定时器初始化以及中断处理函数

void SysTick_init(void)
{SysTick_Config(SystemCoreClock/1000);//一毫秒执行一次中断
}void SysTick_Handler(void)
{OSIntEnter();                      //进入中断OSTimeTick();                     //调用ucos的时钟服务程序               OSIntExit();                          //触发任务切换软中断
}

(4)os_dbg.c中#define OS_COMPILER_OPT //__root
(6)ucos_ii.h中添加#include “stm32f4xx.h”,这个比较重要,没有也会导致程序死机

3、主函数

#include "stm32f4xx.h"
#include "ucos_ii.h"
//设置任务优先级
#define START_TASK_PRIO                 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE                  64
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);   int main(void)
{ OSInit();   OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务OSStart();
}//开始任务
void start_task(void *pdata)
{SysLED_Init();SysTick_init();USART_Config();printf("初始化完成\r\n");while(1){OSTimeDly(500);SysLed();OSTimeDly(500);SysLed();}
} 

注:文中参考或自写部分均加以说明,其他代码均为官方源码,

STM32F4UCOSII移植相关推荐

  1. PowerBuilder程序 ASA 数据库移植后不能连接解决

    前言: 软件开发工具实践课作业用的powerbuilder自带的数据库画板建立的,建好之后运行成功后就没有再管过了.后来代码在别人的机器跑不起来.报错信息如下 找到原因: 程序运行完后,没有手动断开连 ...

  2. web server大全之GoAhead移植(转载)

    转自:http://linux.chinaunix.net/techdoc/develop/2009/06/19/1119124.shtml 注:最近在做goAhead web server和移植其到 ...

  3. Tomcat V6 Examples移植到Apusic V5.1

    目标:将Tomcat V6的的例子Examples移植到Apusic V5.1上 术语:Tomcat:只提供了WEB容器的开源服务器: Apusic:提供了完整的J2EE支持的商用服务器: %TOMC ...

  4. 嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得

    **************************************************************************************************** ...

  5. java的移植性_详细介绍JAVA的可移植性

    软件可移植性指与软件从某一环境转移到另一环境下的难易程度.为获得较高的可移植性,在设计过程中常采用通用的程序设计语言和运行支撑环境.尽量不用与系统的底层相关性强的语言.下面介绍JAVA的可移植性. 1 ...

  6. [mqtt]mqtt嵌入式移植

    目前在无线这块,很多4G模组的厂商已经将mqtt放入模块内,无需在项目代码中再实现mqtt移植 github eclipse paho source code: https://github.com/ ...

  7. NDK/JNI demo ( 五 ) ORB_SLAM2在Android上的移植过程

    Android平台搭建和NDK环境配置 Android移植基础 NDK是集成的Android中调用C++代码的工具包,核心是JNI(Java Native Interface)技术,具体这里略过不表. ...

  8. 如何将cocos2d-x程序分别移植到ios,android,windowsphone三个手机平台上

    作者:方格子 链接:https://www.zhihu.com/question/21505500/answer/22152464 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  9. 嵌入式Web服务器移植

    第一步 Boa程序的移植 1.下载Boa源码 下载地址: http://www.boa.org/, 或者http://sourceforge.net 最新发行版本: 0.94.13 下载 boa-0. ...

  10. 【数据库】mysql移植

    一.源码下载 1.下载mysql源码 源码下载地址:选择版本:5.1.72(这是个老版本,高版本需要使用cmake) https://cdn.mysql.com/archives/mysql-5.1/ ...

最新文章

  1. Solr初始化源码分析-Solr初始化与启动
  2. xml发展历史和用途
  3. ubuntu 16.04下安装oracle jdk 1.7
  4. “鹅厂养鹅”是假的,但腾讯这个“山洞”是真的
  5. 关于IDEA WEB项目的创建与无法继承HttpServlet问题
  6. 信号量 互斥锁 条件变量的区别
  7. echarts画图实例讲解
  8. eval函数python_Python eval()函数
  9. 闲鱼:Thread.sleep(0) 到底有什么用?我:有点懵~
  10. jquery 手型 鼠标穿过时_css各种手型集合(css禁止手型)-Fun言
  11. smallpt: Global Illumination in 99 lines of C++讲解
  12. 基于Servlet+JSP+JDBC的登录注册案例
  13. tomcat的启动过程
  14. Django学习笔记(五)
  15. visio的.vsd格式文件转换.eps格式文件的方法+Gsview裁剪EPS文件
  16. popupwindow 底部弹出+背景半透明
  17. jQuery对Ajax的升级简化
  18. Windows官方原版操作系统下载
  19. 京东618脚本2021最新 (仿兜兜风f大佬作品,亲测有效)
  20. qq修改聊天记录保存位置

热门文章

  1. 毫秒级超低延时直播产品实测(PRTC直播/webRTC直播)
  2. cocos2dx 组件
  3. ANSYS FLUENT软件基础介绍
  4. CREO图文教程:三维设计案例之水龙头的螺旋弹簧设计图文教程之详细攻略
  5. 论文期刊科普-SCI SSCI CSSCI CSCD和北大核心期刊分别是什么?
  6. 解决Ubuntu显卡驱动的问题
  7. 【综合实训】图书管理系统——详细设计说明书
  8. 计算机图学与工业设计,工业设计和工程制图的关系
  9. 00 VirtualBox安装Windows7 32位系统
  10. photoshop插件开发