uCOSII移植ARM的笔记

上传人:cl****1 文档编号:560913157 上传时间:2023-07-20 格式:DOC 页数:36 大小:516KB
返回 下载 相关 举报
uCOSII移植ARM的笔记_第1页
第1页 / 共36页
uCOSII移植ARM的笔记_第2页
第2页 / 共36页
uCOSII移植ARM的笔记_第3页
第3页 / 共36页
uCOSII移植ARM的笔记_第4页
第4页 / 共36页
uCOSII移植ARM的笔记_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《uCOSII移植ARM的笔记》由会员分享,可在线阅读,更多相关《uCOSII移植ARM的笔记(36页珍藏版)》请在金锄头文库上搜索。

1、uCOS-ll移植ARM的笔记UCOS-II的移植需要提供2, 3个文件分别介绍如下:一:OS_CPU.H1与编译器有关的数据类型经典的全局变量定义,可以套用,简洁明了实用性好。#ifdef OS_CPU_GLOBALS#defi ne OS_CPU_EXT#else#defi ne OS_CPU_EXT extern#en dif只是按照不同的编译器编写对应的数据类型的typedef在上面定义的各种数据类型中按照ARM7的堆栈宽度选择 INT32Utypedef INT32U OS_STK;/*堆栈是32位宽度*/对应于ARM7的数据类型的编写如下typedefun sig nedcharB

2、OOLEAN;/*布尔变量*/typedefun sig nedcharINT8U;/*无符号8位整型变量*/typedefsig nedcharINT8S;/*有符号8位整型变量*/typedefun sig nedshortINT16U;/*无符号16位整型变量*/typedefsig nedshortINT16S;/*有符号16位整型变量*/typedefun sig nedintINT32U;/*无符号32位整型变量*/typedefsig nedint INT32S;/*有符号32位整型变量*/typedeffloatFP32;/*单精度浮点数(32位长度)*/typedefdoub

3、leFP64;/*双精度浮点数(64位长度)*/2与处理器相关的代码先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式2#defi neOS CRITICAL METHOD/*选择开、关中断的方式*/swi(0x00)voidOS_TASK_SW(void);/*任务级任务切换函数*/swi(0x01)void_OSStartHighRdy(void);丿/*运行优先级最高的任务*/swi(0x02)voidOS_ENTER_CRITICAL(void);/*关中断*/swi(0x03)voidOS_EXIT_CRITICAL(void);/*开中断*/swi(0x40)v

4、oid*GetOSFu ncti on Addr(i ntIn dex);/*获取系统服务函数入口*/swi(0x41)void*GetUsrFu ncti on Addr(i ntIn dex);/*获取自定义服务函数入口*/swi(0x42)voidOSISRBegi n(void);/*中断开始处理*/swi(0x43)int OSISRNeedSwap(void);/*判断中断是否需要切换*/swi(0x80)voidCha ngeToSYSMode(void);/*任务切换到系统模式*/swi(0x81)voidCha ngeToUSRMode(void);/*任务切换到用户模式*/

5、swi(0x82)voidTaskIsARM(INT8Uprio);/*任务代码是ARM代码*/swi(0x83)voidTasklsTHUMB(INT8Uprio);/* 任务代码是THUMB*/定义堆栈的生长方式,ARM7内核支持两种生长方式,但是ADS的C语言编译器只支持从上往下的生长方式,因此:#defi ne OS_STK_GROWTH 1/*堆栈是从上往下长的,0 从下往上的生长方式*/最后几行分别定义了用户模式01和系统模式1f以及IRQ中断禁止的指令80三个立即数,方便调用。#defi ne USR32Mode 0x10/*用户模式*/#defi ne SYS32Mode 0x

6、1f/*系统模式*/#defi ne NoI nt0x80还有两个预定义往后看应该知道作用,暂不考虑,不是很重要。#ifndef USER_USING_MODE/*任务缺省模式*/#defi ne USER_USING_MODEUSR32Mode #en dif#ifndef OS_SELF_EN#define OS_SELF_EN0/*允许返回OS与任务分别编译、固化 */#en difOS_CPU_EXT INT32U OsE nterSum;/*关中断计数器(开关中断的信号量)*/二. OS_CPU.C 文件头文件的引用:#defi ne OS_CPU_GLOBALS#in elude

7、con fig.h/* 函数名称:OSTaskStklnit*功能描述:任务堆栈初始化代码,本函数调用失败会使系统崩溃*输入:task :任务开始执行的地址*pdata:传递给任务的参数*ptos:任务的堆栈开始位置*opt:附加参数,当前版本对于本函数无用,具体意义参见OSTaskCreateExt()的opt参数*输出:栈顶指针位置*全局变量:*调用模块:*作者:陈明计*日期:2003年6月5日*修改人:陈明计*日期:2003年6月13日*/OS_STK *OSTaskStkl nit(void (*task)(void *pd), void *pdata, OS_STK*ptos,INT

8、16U opt) OS_STK *stk;opt = stk =opt; ptos;/* opt没有使用。作用是避免编译器警告*/*获取堆栈指针*/*建立任务环境,ADS1.2使用满递减堆栈*/*stk(OS_STK)task;/* pc */*-stk(OS_STK)task;/* Ir */*-stk = 0;/*r12*/*-stk = 0;/*r11*/*-stk = 0;/*r10*/*-stk = 0;/*r9*/*-stk = 0;/*r8*/*-stk = 0;/*r7*/*-stk = 0;/*r6*/*-stk = 0;/*r5*/*-stk = 0;/*r4*/*-stk

9、 = 0;/*r3*/*-stk = 0;/*r2*/*-stk = 0;/*r1*/*-stk = (unsignedint) pdata; /* r0,第一个参数使用RO 传递 */*-stk = (USER_USING_MODE|OxOO); /* spsr ,允许 IRQ, FIQ 中断 */*-stk = 0;/* 关中断计数器 OsE nterSum; */return (stk);OSTaskStk In it()函数的功能是初始化任务的栈结构,任务的堆栈结构与CPU的体系结构、编译器有密切的关联。从ARM的结构可以写出如下的栈结构:程序计数器PC,程序链接器LR,R12 R1

10、, R0用于传递第一个参数 pdata , CPSR/SPSR,关中断计数器(用 于计算关中断的次数,这样就实现了中断的嵌套),返回的地址指针是指向的最后一个存入的数据,而不是一个空地址。/* 函数名称:SWI_Exception*功能描述:软中断异常处理程序,提供一些系统服务*输入:SWI_Num:功能号*Regs0为第一个参数,也是返回值*Regs1为第二个参数*Regs2为第三个参数*Regs3为第四个参数*输出:根据功能而定*全局变量:无*调用模块:无*作者:陈明计*日期:2003年6月5日*修改人:陈明计*日期:2003年6月19日*修改人:陈明计*日 期:2003年6月24日*/#

11、if OS_SELF_EN extern int const extern int const 0_OSFu nctio nAddr;_UsrFu nctio nAddr;#en difint *Regs)void SWI_Exceptio n(intSWI_Num,OS_TCB *ptcb;switch(SWI_Num)/case 0x00:件 */ break;/case 0x01:/ break;case 0x02:文件*/_asm/* 任务切换函数 OS_TASK_SW,参考os_cpu_s.s 文/*启动任务函数OSStartHighRdy ,参考os_cpu_s.s 文件*/* 关

12、中断函数 OS_ENTER_CRITICAL(),参考 os_cpu.hMSR SPSR_c,ROOsE nterSum+;break;case 0x03:/*开中断函数 OS_EXIT_CRITICAL(),参考 os_cpu.h 文件*/if (-OsE nterSum=0)asmMRSR0,SPSRBICR0,R0, #NolntMSRSPSR_c,R0break;#if OS SELF ENcase 0x40:/*返回指定系统服务函数的地址*/*函数地址存于数组OSFunctionAddr中*/*数组 OSFunctionAddr需要另外定义*/*Regs0为第一个参数,也是返回值*/*Regs1为第二个参数*/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号