没有合适的资源?快使用搜索试试~ 我知道了~
首页UCOS-II移植ARM的笔记
资源详情
资源评论
资源推荐

移植 的笔记(转贴)
的移植需要提供 , 个文件分别介绍如下:
一:
与编译器有关的数据类型
经典的全局变量定义,可以套用,简洁明了实用性好。
!"
##只是按照不同的编译器编写对应的数据类型的 !$%
##对应于 & 的数据类型的编写如下
!$%'()*+"#,-################./布尔变
量DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD/.
!$%'()*+"#,0-##################./无符号 0 位整型变
量DDDDDDDDDDDDDDDDDDDDDDD/.
!$%(##)*+"#,0-##################./有符号 0 位整型变
量DDDDDDDDDDDDDDDDDDDDDDD/.
!$%'(*1"!,2-#################./无符号 2 位整型变
量DDDDDDDDDDDDDDDDDDDDDD/.
!$%(##*1"!,2-#################./有符号 2 位整型变
量DDDDDDDDDDDDDDDDDDDDDD/.
!$%'(!##,-#################./无符号 位整型变
量DDDDDDDDDDDDDDDDDDDDDD/.
!$%(##!##,-#################./有符号 位整型变
量DDDDDDDDDDDDDDDDDDDDDD/.
!$%1+!#########3-###################./单精度浮点数( 位长
度)DDDDDDDDDDDDDDDD/.
!$%1'4########325-###################./双精度浮点数(25 位长
度)DDDDDDDDDDDDDDDD/.
#
##在上面定义的各种数据类型中按照 & 的堆栈宽度选择 ,
!$%,########6-#################./堆栈是 位宽
度DDDDDDDDDDDDDDDDDDDDDDDDDD/.
#
###
与处理器相关的代码
###先定义中断的实现方式,预先设定的中断方式有三种,在 & 中设置为方
式
####7###############./选择开、关中断的方式/.
#
89: ::;<16=9<1;-./任务级任务切换函数
/.
1

89: :;<1!+"!(*$9<1;-./运行优先级最高的任务
/.
89: :;<1,9<1;-./关中断/
.
89: :;<19<1;-./开中断/.
89: 5:;<1/!3')!1"9! ;-./获取系统服务函数入
口/.
89: 5;<1/!"3')!1"9! ;-./获取自定义服务函数
入口/.
89: 5;<1(9<1;-./中断开始处理/.
89: 5;!,8+%9<1;-./判断中断是否需要切换
/.
89: 0:;<1*+(1>19<1;-./任务切换到系统模式
/.
89: 0;<1*+(119<1;-./任务切换到用户模式
/.
89: 0;<1+?9,0%"1;-./任务代码是 代码
/.
89: 0;<1+?9,0%"1;-./任务代码是
/.
######定义堆栈的生长方式,& 内核支持两种生长方式,但是 7 的 语
言编译器只支持从上往下的生长方式,因此:
6=########################./#堆栈是从上往下长的,:-从
下往上的生长方式DDDDDDDD/.
#
最后几行分别定义了用户模式 : 和系统模式 以及 @ 中断禁止的指令 0:
三个立即数,方便调用。
1: :./用户模式/.
>1: ./系统模式/.
,1!: 0:
###还有两个预定义往后看应该知道作用,暂不考虑,不是很重要。
#,7
,7 1./任务缺省模式
/.
3,
3,:./允许返回 与任务分别编译、
固化/.
,!"'A-./关中断计数器(开关中断
的信号量)/.
2

二.OS_CPU.C 文件
头文件的引用:
#define OS_CPU_GLOBALS
#include "config.h"
/
*********************************************************************
************************************
** 函数名称: OSTaskStkInit
** 功能描述: 任务堆栈初始化代码,本函数调用失败会使系统崩溃
** 输 入: task : 任务开始执行的地址
** pdata :传递给任务的参数
** ptos :任务的堆栈开始位置
** opt :附加参数,当前版本对于本函数无用,具体意义参见
OSTaskCreateExt()的 opt 参数
** 输 出: 栈顶指针位置
** 全局变量:
** 调用模块:
**
** 作 者: 陈明计
** 日 期: 2003 年 6 月 5 日
**----------------------------------------------------------------------------------------------------
---
** 修改人: 陈明计
** 日 期: 2003 年 6 月 13 日
**----------------------------------------------------------------------------------------------------
--
*********************************************************************
***********************************/
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos,
INT16U opt)
{
OS_STK *stk;
opt = opt; /* 'opt' 没有使用。作用是避免编译器警告 */
stk = ptos; /* 获取堆栈指针 */
/* 建立任务环境,ADS1.2 使用满递减堆栈 */
*stk = (OS_STK) task; /* pc */
*--stk = (OS_STK) task; /* lr */
*--stk = 0; /* r12 */
3

*--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 = 0; /* r3 */
*--stk = 0; /* r2 */
*--stk = 0; /* r1 */
*--stk = (unsigned int) pdata; /* r0,第一个参数使用 R0 传递 */
*--stk = (USER_USING_MODE|0x00); /* spsr,允许 IRQ, FIQ 中断 */
*--stk = 0; /* 关中断计数器 OsEnterSum; */
return (stk);
}
+?!?!()函数的功能是初始化任务的栈结构,任务的堆栈结构与
的体系结构、编译器有密切的关联。从 的结构可以写出如下的栈结
构:程序计数器 ,程序链接器 ,-,: 用于传递第一个参数
%+!+,.,关中断计数器(用于计算关中断的次数,这样就实现了
中断的嵌套),返回的地址指针是指向的最后一个存入的数据,而不是一个空
地址。
/
*********************************************************************
************************************
** 函数名称: SWI_Exception
** 功能描述: 软中断异常处理程序,提供一些系统服务
**
** 输 入: SWI_Num:功能号
** Regs[0] 为第一个参数,也是返回值
** Regs[1] 为第二个参数
** Regs[2] 为第三个参数
** Regs[3] 为第四个参数
** 输 出: 根据功能而定
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003 年 6 月 5 日
**----------------------------------------------------------------------------------------------------
---
** 修改人: 陈明计
4

** 日 期: 2003 年 6 月 19 日
**----------------------------------------------------------------------------------------------------
---
** 修改人: 陈明计
** 日 期: 2003 年 6 月 24 日
**----------------------------------------------------------------------------------------------------
--
*********************************************************************
***********************************/
#if OS_SELF_EN > 0
extern int const _OSFunctionAddr[];
extern int const _UsrFunctionAddr[];
#endif
void SWI_Exception(int SWI_Num, int *Regs)
{
OS_TCB *ptcb;
switch(SWI_Num)
{
//case 0x00: /* 任务切换函数 OS_TASK_SW,参考 os_cpu_s.s 文
件 */
// break;
//case 0x01: /* 启动任务函数 OSStartHighRdy,参考 os_cpu_s.s
文件 */
// break;
case 0x02: /* 关中断函数 OS_ENTER_CRITICAL(),参考
os_cpu.h 文件 */
__asm
{
MRS R0, SPSR
ORR R0, R0, #NoInt
MSR SPSR_c, R0
}
OsEnterSum++;
break;
case 0x03: /* 开中断函数 OS_EXIT_CRITICAL(),参考 os_cpu.h
文件 */
if (--OsEnterSum == 0)
{
__asm
{
MRS R0, SPSR
BIC R0, R0, #NoInt
MSR SPSR_c, R0
5
剩余22页未读,继续阅读











安全验证
文档复制为VIP权益,开通VIP直接复制

评论1