请问痔疮治疗的方法为何LDMFD SP,{R3,SP,LR}^不能回写

当前位置: →
→ 基于ARM7LPC2131平台的μC/OS-Ⅱ的移植
基于ARM7LPC2131平台的μC/OS-Ⅱ的移植
& 作者及来源: 蔷薇理想人生 - 博客园 &
&收藏到→_→:
摘要: 基于ARM7(LPC2131)平台的μC/OS-Ⅱ的移植
"基于ARM7LPC2131平台的μC/OS-Ⅱ的移植"::
1.&c/os-ⅱ简介
&&&uc/os-ii读做&micro&cos2&,&意为&微控制器版本2&。uc/os-ii是著名的,源代码公开的实时内核,可用于各类8位,16位和32位或dsp。从uc/os算起,该内核已有十多年应用历史,在诸多领域得到广泛应用。
2.&c/os-ⅱ的特点
(1)提供源代码
(2)可固化
(3)可裁剪
(4)可剥夺
(5)多任务
(7)任务栈
(8)系统服务
(9)中断管理
(10)稳定性与
arm处理器核的c有很多,大概有sdt,ads1.2,iar,tasking和gcc等。我最终选择的是ads1.2编译程序和调试。
4.arm7简介
arm7处理器核具有用户,系统,管理,中止,未定义,中断和快中断7中工作模式。其中除了用户模式外其他均为特权模式。同时支持两个指令集:16位thumb指令集和32位arm指令集。
5.开发环境的搭建
:windows&xp
调试环境:axd(ads1.2配套的软件)
串口调试工具
6.项目中所运用到的技术创新
(1)实现了加密程序,保护了用户代码,利用在特定的地址0x1fc处写入特定的值0x实现加密
(2)通过工程配置文件加载程序代码,实现了写的模板工程,不用每次配置工程设置
(3)初始化程序和代码都留有很多扩充的接口,方便不同的用户需要实现不同的启动代码功能和扩充的功能
7.项目的特色
(1)在本文档中有完整的源代码,并且有很详细的注释
(2)只要具备同样的软硬件环境,根据我的《过程与结果总结报告》完全可以实现这个项目
(3)同时完成了引导程序和的移植
(4)涉及到软硬件的知识,不仅仅只是软件
二.移植过程
1.编写bootloader(arm启动代码)
1.启动代码综述
在一般32位arm应用系统中,软件大多数采用c语言进行编程,并且以嵌入式为开发平台,这样大大的提高了开发效率及软件性能。为了能够进行系统初始化,通常会用一个汇编文件作为启动代码。它可以实现向量表定义、堆栈初始化、系统变量初始化、中断系统初始化、i/o初始化、外围初始化和地址重映射等操作。
arm公司之设计内核,不生产芯片,只是把内核授权给其他厂商。其他厂商购买了授权后加入自己的外设,生产出各具特色的芯片。这样就促进了基于arm处理器核的芯片的多元化,但也使得各种芯片的启动代码差别很大,不易编写出统一的启动代码。
2.文件的组成
汇编文件1.startup.s:异常向量表、各模式堆栈初始化和跳到main()函数入口等
&&&&&2.irq.s :负责管理中断嵌套
c文件&&&target.c :初始化目标板
头文件 config.h :系统配置和类型定义
target.h :一些和目标板相关的声明
lpc2294.h :lpc2000系列芯片特殊寄存器定义
分散加载文件mem_a.scf:在片内flash发布,relinflash
mem_b.scf:在片内ram调试,debuginram,在ucosii中不使用这种布局模式
mem_c.scf:在片内flash调试,debuginflash
3.各源代码文件内容及其注释
1.startup.s:
;**--------------file&info---------------------------------------------
;**&file&name:& startup.s
;**&last&modified&date:&&
;**&last&version:& 1.0
;**&descriptions:&为&lpc2100系列芯片的启动代码,从这里开始执行,包括初始化代码,为每一种模
;**&&&&&&&&&&&&&&&式&的进入口和任务的堆栈
;定义堆栈的大小
svc_stack_legth&&&&&&&&&equ&&&&&&&&&0
fiq_stack_legth&&&&&&&&&equ&&&&&&&&&0
irq_stack_legth&&&&&&&&&equ&&&&&&&&&256
abt_stack_legth&&&&&&&&&equ&&&&&&&&&0
und_stack_legth&&&&&&&&&equ&&&&&&&&&0
noint&&&&&&&equ&0x80 ;bit7,i位
nofiq equ 0x40 ;bit6,f位
usr32mode&&&equ&0x10 ;m[4:0]=10000,用户模式
svc32mode&&&equ&0x13 ;m[4:0]=10011,管理模式
sys32mode&&&equ&0x1f ;m[4:0]=11111,系统模式
irq32mode&&&equ&0x12 ;m[4:0]=10010,irq中断
fiq32mode&&&equ&0x11 ;m[4:0]=10001,快速中断
&&&&import&__use_no_semihosting_swi
;引入的外部标号在这声明
&&&&import&&fiq_exception&&&&&&&&&&&&&&&&&&&;&快速中断异常处理程序
&&&&import&&__main&&&&&&&&&&&&&&&&&&&&&&&&&&;&c语言主程序入口&
&&&&import&&targetresetinit&&&&&&&&&&&&&&&&&;目标板基本初始化
;给外部使用的标号在这声明
&&&&export&&bottom_of_heap
&&&&export&&stackusr
&&&&export&&reset
&&&&export&__user_initial_stackheap
&&&&code32
&&&&area&&&&vectors,code,readonly
&&&&&&&&entry
;中断向量表
&&&&&&&&ldr&&&&&pc,&resetaddr ;0x00,复位
&&&&&&&&ldr&&&&&pc,&undefinedaddr ;0x04,未定义地址
&&&&&&&&ldr&&&&&pc,&swi_addr ;0x08,软件中断
&&&&&&&&ldr&&&&&pc,&prefetchaddr ;0x0c,预取指中止
&&&&&&&&ldr&&&&&pc,&dataabortaddr ;0x10,数据中止
&&&&&&&&dcd&&&&&0xb9205f80 ;0x14,保留
&&&&&&&&ldr&&&&&pc,&[pc,&#-0xff0] ;0x18,irq中断
&&&&&&&&ldr&&&&&pc,&fiq_addr ;0x1c,快速中断
resetaddr&&&&&&&&&&&dcd&&&&&resetinit ;复位初始化处理程序地址
undefinedaddr&&&&&&&dcd&&&&&undefined ;未定义指令处理程序地址
swi_addr&&&&&&&&&&&&dcd&&&&&softwareinterrupt ;软件中断处理程序地址
prefetchaddr&&&&&&&&dcd&&&&&prefetchabort ;预取指中止处理程序地址
dataabortaddr&&&&&&&dcd&&&&&dataabort ;数据中止处理程序地址
nouse&&&&&&&&&&&&&&&dcd&&&&&0 ;未使用
irq_addr&&&&&&&&&&&&dcd&&&&&0 ;irq中断,已在"ldr&[pc,#-0xff0]"中处理
fiq_addr&&&&&&&&&&&&dcd&&&&&fiq_handler
;未定义指令
&&&&&&&&b&&&&&&&undefined ;死循环
softwareinterrupt
;&&&&&&&&b&&&&&&&softwareinterrupt
;//增加开/关中断处理&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&cmp&&&&&r0,&#4 ;判断传过来的参数是否大于4
&&&&&&&&ldrlo&&&pc,&[pc,&r0,&lsl&#2] ;小于4(参数正确),进行查表
&&&&&&&&movs&&&&pc,&lr ;大于或者等于4(参数出错),则返回
swifunction
&&&&&&&&dcd&&&&&irqdisable&&&&&&& ;0号调用,禁止irq中断
&&&&&&&&dcd&&&&&irqenable&&&&&&&& ;1号调用,使能irq中断
&&&&&&&&dcd fiqdisable & ;2号调用,禁止fiq中断
&&&&&&&&dcd fiqenable & ;3号调用,使能fiq中断
irqdisable
&&&&&&&&;关irq中断
&&&&&&&&mrs&&&&&r0,&spsr ;读取spsr的值
&&&&&&&&orr&&&&&r0,&r0,&#noint ;置位i位,设置关irq中断
&&&&&&&&msr&&&&&spsr_c,&r0 ;回写spsr
&&&&&&&&movs&&&&pc,&lr ;返回
&&&&&&&&;开irq中断
&&&&&&&&mrs&&&r0,&spsr
&&&&&&&&bic&&&r0,&r0,&#noint ;清零i位,设置开irq中断
&&&&&&&&msr&&&spsr_c,&r0
&&&&&&&&movs&&&&pc,&lr&&
fiqdisable
&&&&&&&&;关fiq中断
&&&&&&&&mrs&&&&&r0,&spsr
&&&&&&&&orr&&&&&r0,&r0,&#nofiq ;置位f位,设置关fiq中断
&&&&&&&&msr&&&&&spsr_c,&r0
&&&&&&&&movs&&&&pc,&lr
&&&&&&&&;开fiq中断
&&&&&&&&mrs&&&r0,&spsr
&&&&&&&&bic&&&r0,&r0,&#nofiq ;清零f位,设置开fiq中断
&&&&&&&&msr&&&spsr_c,&r0
&&&&&&&&movs&&&&pc,&lr
;取指令中止
prefetchabort
&&&&&&&&b&&&&&&&prefetchabort ;死循环
;取数据中止
&&&&&&&&b&&&&&&&dataabort ;死循环
fiq_handler
&&&&&&&&stmfd&&&sp!,&{r0-r3,&lr} ;寄存器r0~r3,lr入栈
&&&&&&&&bl&&&&&&fiq_exception ;调用fiq处理程序
&&&&&&&&ldmfd&&&sp!,&{r0-r3,&lr} ;寄存器r0~r3,lr出栈
&&&&&&&&subs&&&&pc,&&lr,&&#4&&&&&&&& ;计算返回地址
;/*****************************************************************************************
;**&unction&name& 函数名称:& initstack
;**&descriptions& 功能描述:& &&初始化堆栈
;**&created&by& 作 者:& 吴友强
;**&created&date& 日 期:& &日
;*****************************************************************************************/
;初始化堆栈,此时禁止irq和fiq中断,处于arm状态
initstack&&&&
&&&&&&&&mov&&&&&r0,&lr
;build&the&svc&stack
;设置管理模式堆栈
&&&&&&&&msr&&&&&cpsr_c,&#0xd3
&&&&&&&&ldr&&&&&sp,&stacksvc
;build&the&irq&stack
;设置中断模式堆栈
&&&&&&&&msr&&&&&cpsr_c,&#0xd2
&&&&&&&&ldr&&&&&sp,&stackirq
;build&the&fiq&stack
;设置快速中断模式堆栈
&&&&&&&&msr&&&&&cpsr_c,&#0xd1
&&&&&&&&ldr&&&&&sp,&stackfiq
;build&the&dataabort&stack
;设置中止模式堆栈
&&&&&&&&msr&&&&&cpsr_c,&#0xd7
&&&&&&&&ldr&&&&&sp,&stackabt
;build&the&udf&stack
;设置未定义模式堆栈
&&&&&&&&msr&&&&&cpsr_c,&#0xdb
&&&&&&&&ldr&&&&&sp,&stackund
;build&the&sys&stack
;设置系统模式堆栈
&&&&&&&&msr&&&&&cpsr_c,&#0xdf ;切换到系统模式,之后将在系统模式此文来自: 马开东博客
转载请注明出处 网址:
&&&&&&&&ldr&&&&&sp,&=stackusr ;除非进行模式切换
&&&&&&&&mov&&&&&pc,&r0
;/*****************************************************************************************
;**&unction&name& 函数名称:& resetinit
;**&descriptions& 功能描述:& &复位入口
;**&created&by& 作 者:& 吴友强
;**&created&date& 日 期:& &日
;**----------------------------------------------------------------------------------------
;*****************************************************************************************/
resetinit&&&&
&&&&&&&&bl&&&&&&initstack&&&&&&&&&&&&&&&;初始化堆栈&
&&&&&&&&bl&&&&&&targetresetinit&&&&&&&&&;目标板基本初始化&
&&&&&&&&b&&&&&&&__main&&&&&&&&&&&&&&&&&&;跳转到c语言入口&
;/*****************************************************************************************
;**&unction&name& 函数名称:& __user_initial_stackheap
;**&descriptions& 功能描述:& 库函数初始化堆和栈,不能删除
;**&created&by& 作 者:& 吴友强
;**&created&date& 日 期:& &日
;*****************************************************************************************/
__user_initial_stackheap&&&&
&&&&ldr&&&r0,=bottom_of_heap
;&&&&ldr&&&r1,=stackusr
&&&&mov&&&pc,lr
stacksvc&&&&&&&&&&&dcd&&&&&svcstackspace&+&(svc_stack_legth&-&1)*&4 ;管理模式堆栈
stackirq&&&&&&&&&&&dcd&&&&&irqstackspace&+&(irq_stack_legth&-&1)*&4 ;irq模式堆栈
stackfiq&&&&&&&&&&&dcd&&&&&fiqstackspace&+&(fiq_stack_legth&-&1)*&4 ;fiq模式堆栈
stackabt&&&&&&&&&&&dcd&&&&&abtstackspace&+&(abt_stack_legth&-&1)*&4 ;中止模式堆栈
stackund&&&&&&&&&&&dcd&&&&&undtstackspace&+&(und_stack_legth&-&1)*&4;未定义模式堆栈
;/*****************************************************************************************
;**&unction&name& 函数名称:& crpdata
;**&descriptions& 功能描述:& 芯片加密,代码保护
;**&input&parameters& 输 入:&&& none&无
;**&returned&value&&& 输 出&:&& none&无
;**&used&global&variables&全局变量:& none&无
;**&calling&modules& 调用模块:& none&无
;**&created&by& 作 者:& 吴友强
;**&created&date& 日 期:& &日
;*****************************************************************************************/
&&&&if&:def:&en_crp
&&&&&&&&if&&.&&=&0x1fc
&&&&&&&&info&&&&1,"/nthe&data&at&0x000001fc&must&be&0x./nplease&delete&some&source&before&this&line."
&&&&&&&&endif
&&&&while&.&&&0x1fc ;循环用nop填充,直到0x1fc
&&&&dcd&&&&&0x&&&&&&&&&&;/*&当此数为0x时,用户程序被保护&*/
;/*&分配堆栈空间&*/
&&&&&&&&area&&&&mystacks,&data,&noinit,&align=2
svcstackspace&&&&&&space&&&svc_stack_legth&*&4&&;&管理模式堆栈空间
irqstackspace&&&&&&space&&&irq_stack_legth&*&4&&;&中断模式堆栈空间
fiqstackspace&&&&&&space&&&fiq_stack_legth&*&4&&;&快速中断模式堆栈空间
abtstackspace&&&&&&space&&&abt_stack_legth&*&4&&;&中止义模式堆栈空间
undtstackspace&&&&&space&&&und_stack_legth&*&4&&;&未定义模式堆栈
&&&&&&&&area&&&&heap,&data,&noinit ;heap通过分散加载文件定位
bottom_of_heap&&&&space&&&1
&&&&&&&&area&&&&stacks,&data,&noinit ;stack通过分散加载文件定位
noint&&&&&&&equ&0x80
usr32mode&&&equ&0x10
svc32mode&&&equ&0x13
sys32mode&&&equ&0x1f
irq32mode&&&equ&0x12
fiq32mode&&&equ&0x11
&&&&code32
&&&&area&&&&irq,code,readonly
$irq_label&handler&$irq_exception_function
&&&&&&&&export&&$irq_label&&&&&&&&&&&&&&&&&&&&&&;&输出的标号
&&&&&&&&import&&$irq_exception_function&&&&&&&&&;&引用的外部标号
$irq_label
&&&&&&&&sub&&&&&lr,&lr,&#4&&&&&&&&&&&&&&&&&&&&&&;&计算返回地址
&&&&&&&&stmfd&&&sp!,&{r0-r3,&r12,&lr}&&&&&&&&&&&;&保存任务环境
&&&&&&&&mrs&&&&&r3,&spsr&&&&&&&&&&&&&&&&&&&&&&&&;&保存状态
&&&&&&&&stmfd&&&sp,&{r3,lr}^&&&&&&&&&&&&&&&&&&&&;&保存spsr和用户状态的sp,注意不能回写
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&如果回写的是用户的sp,所以后面要调整sp
&&&&&&&&nop
&&&&&&&&sub&&&&&sp,&sp,&#4*2
&&&&&&&&msr&&&&&cpsr_c,&#(noint&|&sys32mode)&&&&;&&切换到系统模式&&&&
&&&&&&&&bl&&&&&&$irq_exception_function&&&&&&&&&;&&调用c语言的中断处理程序
&&&&&&&&msr&&&&&cpsr_c,&#(noint&|&irq32mode)&&&&;&switch&bak&to&irq&mode&切换回irq模式
&&&&&&&&ldmfd&&&sp,&{r3,lr}^&&&&&&&&&&&&&&&&&&&&;&恢复spsr和用户状态的sp,注意不能回写
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&如果回写的是用户的sp,所以后面要调整sp
&&&&&&&&msr&&&&&spsr_cxsf,&r3
&&&&&&&&add&&&&&sp,&sp,&#4*2&&&&&&&&&&&&&&&&&&&&
&&&&&&&&ldmfd&&&sp!,&{r0-r3,&r12,&pc}^&&&&&&&&&&
;/*&以下可添加中断句柄,根据实际此文来自: 马开东博客
转载请注明出处 网址:
情况改变&*/
;timer0_handler&&handler&timer0
3.target.c
#define&in_target
#include&"config.h"
void&__irq&irq_exception(void)
&&&&while(1);&&&&&&&&&&&&&&&&&&&//&&这一句替换为自己的代码
void&fiq_exception(void)
&&&&while(1);&&&&&&&&&&&&&&&&&&&//&&这一句替换为自己的代码
void&targetinit(void)
&&&&/*&添加自己的代码&*/
&&&&&&&&void&targetresetinit(void)
#ifdef&__debug_ram&&&& //如果在片内ram调试
&&&&memmap&=&0x2;&&&&&&&&&&&&&&&&&&&//映射到片内ram
#ifdef&__debug_flash&&&& //如果在片内flash调试
&&&&memmap&=&0x1;&&&&&&&&&&&&&&&&&&&//映射到片内flash
#ifdef&__in_chip&&&& //如果在片内flash发布(将会被加密)
&&&&memmap&=&0x1;&&&&&&&&&&&&&&&&&&&//映射到片内flash
/*&设置系统各部分时钟&*/
&&&&pllcon&=&1; //设置激活但未连接pll
#if&(fpclk&/&(fcclk&/&4))&==&1
&&&&vpbdiv&=&0;
#if&(fpclk&/&(fcclk&/&4))&==&2
&&&&vpbdiv&=&2;
#if&(fpclk&/&(fcclk&/&4))&==&4
&&&&vpbdiv&=&1;
//设定pll的乘因子m和除因子p的值
#if&(fcco&/&fcclk)&==&2
&&&&pllcfg&=&((fcclk&/&fosc)&-&1)&|&(0&&&&5);
#if&(fcco&/&fcclk)&==&4
&&&&pllcfg&=&((fcclk&/&fosc)&-&1)&|&(1&&&&5);
#if&(fcco&/&fcclk)&==&8
&&&&pllcfg&=&((fcclk&/&fosc)&-&1)&|&(2&&&&5);
#if&(fcco&/&fcclk)&==&16
&&&&pllcfg&=&((fcclk&/&fosc)&-&1)&|&(3&&&&5);
&&&&pllfeed&=&0 //发送pll馈送序列,执行设定pll的动作
&&&&pllfeed&=&0x55;
&&&&while((pllstat&&&(1&&&&10))&==&0); //等待pll锁定
&&&&pllcon&=&3; //设置激活并连接pll
&&&&pllfeed&=&0 //发送pll馈送序列,执行激活和链接动作
&&&&pllfeed&=&0x55;
&&&&/*&设置加速模块&*/
&&&&mamcr&=&0; //禁止mam功能
#if&fcclk&&& //根据fcclk的大小来设置mam定时寄存器
&&&&mamtim&=&1;
#if&fcclk&&&
&&&&mamtim&=&2;
&&&&mamtim&=&3;
&&&&mamcr&=&2; //使能mam
&&&&/*&初始化vic&*/
&&&&vicintenclr&=&0 //清零所有中断
&&&&vicvectaddr&=&0;
&&&&vicintselect&=&0;
&&&&/*&添加其他的代码&*/
/***************************************************************************************
**&&&&&&&&&&&&&&&&&&以下为一些与系统相关的库函数的实现
***************************************************************************************/
#include&&rt_sys.h&
#include&&stdio.h&
#pragma&import(__use_no_semihosting_swi)
&int&__rt_div0(int&a)
&&&&a&=&a;
&&&&return&0;
&int&fputc(int&ch,file&*f)
&&&&f&=&f;
&&&&return&0;
int&fgetc(file&*f)
&&&&f&=&f;
&&&&return&0;
int&_sys_close(filehandle&fh)
&&&&return&0;
int&_sys_write(filehandle&fh,&const&unsigned&char&*&buf,&unsigned&len,&int&mode)
&&&&buf&=&
&&&&mode&=&
&&&&return&0;
int&_sys_read(filehandle&fh,&unsigned&char&*&buf,
&&&&&&&&&&&&&&&&&&&&&unsigned&len,&int&mode)
&&&&buf&=&
&&&&mode&=&
&&&&return&0;
void&_ttywrch(int&ch)
int&_sys_istty(filehandle&fh)
&&&&return&0;
int&_sys_seek(filehandle&fh,&long&pos)
&&&&return&0;
int&_sys_ensure(filehandle&fh)
&&&&return&0;
long&_sys_flen(filehandle&fh)
&&&&return&0;
int&_sys_tmpnam(char&*&name,&int&sig,&unsigned&maxlen)
&&&&name&=&
&&&&sig&=&
&&&&maxlen&=&
&&&&return&0;
void&_sys_exit(int&returncode)
&&&&returncode&=&
char&*_sys_command_string(char&*&cmd,&int&len)
&&&&cmd&=&
&&&&len&=&
&&&&return&0;
4.config.h
#ifndef&__config_h&
#define&__config_h
#ifndef&true
#define&true&&1
#ifndef&false
#define&false&0
typedef&unsigned&char&&uint8;&&&&&&&&&&&&&&&&&&&/*&无符号8位整型变量&&*/
typedef&signed&&&char&&int8;&&&&&&&&&&&&&&&&&&&&/*&有符号8位整型变量&&*/
typedef&unsigned&short&uint16;&&&&&&&&&&&&&&&&&&/*&无符号16位整型变量&*/
typedef&signed&&&short&int16;&&&&&&&&&&&&&&&&&&&/*&有符号16位整型变量&*/
typedef&unsigned&int&&&uint32;&&&&&&&&&&&&&&&&&&/*&无符号32位整型变量&*/
typedef&signed&&&int&&&int32;&&&&&&&&&&&&&&&&&&&/*&有符号32位整型变量&*/
typedef&float&&&&&&&&&&fp32;&&&&&&&&&&&&&&&&&&&&/*&单精度浮点数(32位长度)&*/
typedef&double&&&&&&&&&fp64;&&&&&&&&&&&&&&&&&&&&/*&双精度浮点数(64位长度)&*/
#include&&&&"lpc2294.h"
/*&系统设置,&fosc、fcclk、fcco、fpclk必须定义*/
#define&fosc&&&&&&&&&&&&&&&&&&&&//应当与实际一至晶振频率,10mhz~25mhz,应当与实际一至
#define&fcclk&&&&&&&&&&&(fosc&*&4)&&&&&&//系统频率,必须为fosc的整数倍(1~32),且&=60mhz
#define&fcco&&&&&&&&&&&&(fcclk&*&4)&&//cco频率,必须为fcclk的2、4、8、16倍,范围为156mhz~320mhz
#define&fpclk&&&&&&&&&&&(fcclk&/&4)&*&1&&&//vpb时钟频率,只能为(fcclk&/&4)的1、2、4倍
#include&&&&"target.h"&&&&&&&&&&&&&
5.target.h
#ifndef&__target_h&
#define&__target_h
&&&&#ifdef&__cplusplus
&&&&extern&"c"&{
&&&&#endif
&&&&#ifndef&in_target&
extern&void&reset(void); //复位
extern&void&targetinit(void); //目标板初始化
&&&&#endif
&&&&#ifdef&__cplusplus
&&&&#endif
__swi(0x00)&void&swihandle1(int&handle); //软件中断
#define&irqdisable()&swihandle1(0) //禁止irq中断
#define&irqenable()&swihandle1(1) //使能irq中断
#define&fiqdisable()&swihandle1(2) //禁止fiq中断
#define&fiqenable()&swihandle1(3) //使能fiq中断
6.lpc2294.h
/*&向量中断控制器(vic)的特殊寄存器&*/
#define&vicirqstatus&&&&(*((volatile&unsigned&long&*)&0xfffff000))
#define&vicfiqstatus&&&&(*((volatile&unsigned&long&*)&0xfffff004))
#define&vicrawintr&&&&&&(*((volatile&unsigned&long&*)&0xfffff008))
#define&vicintselect&&&&(*((volatile&unsigned&long&*)&0xfffff00c))
#define&vicintenable&&&&(*((volatile&unsigned&long&*)&0xfffff010))
#define&vicintenclr&&&&&(*((volatile&unsigned&long&*)&0xfffff014))
#define&vicsoftint&&&&&&(*((volatile&unsigned&long&*)&0xfffff018))
#define&vicsoftintclear&(*((volatile&unsigned&long&*)&0xfffff01c))
#define&vicprotection&&&(*((volatile&unsigned&long&*)&0xfffff020))
。。。。。。省略
7.men_a.scf适用于片内flash发布
rom_load&0x ;加载区,从0x开始
&&&&rom_exec&0x ;执行区,起始地址,空间大小要和加载区一致
&&&&&&&&startup.o&(vectors,&+first) ;startup.s中的向量表
&&&&&&&&*&(+ro) ;其他代码
&&&&iram&0x ;变量区,内部ram开始
&&&&&&&&startup.o&(mystacks) ;startup.s中的mystacks
&&&&&&&&*&(+rw,+zi) ;文件中的其他变量
&&&&heap&+0&uninit ;系统堆空间
&&&&&&&&startup.o&(heap) ;startup.s中的heap
&&&&stacks&0x&uninit ;lpc2131片内ram最高端
&&&&{ ;系统的堆空间
&&&&&&&&startup.o&(stacks) ;startup.s中的stacks
8.men_c.scf适用于片内flash调试
rom_load&0x0
&&&&rom_exec&0x
&&&&&&&&startup.o&(vectors,&+first)
&&&&&&&&*&(+ro)
&&&&iram&0x
&&&&&&&&startup.o&(mystacks)
&&&&&&&&*&(+rw,+zi)
&&&&heap&+0&uninit
&&&&&&&&startup.o&(heap)
&&&&stacks&0x&uninit
&&&&&&&&startup.o&(stacks)
2.启动代码工作流程
1.芯片复位后,pc=0x,在异常向量表0x处
2.芯片根据异常处理程序地址表,得到复位程序的地址
3.跳转到复位处理程序处
4.调用initstack()函数,初始化个模式的堆栈
5.调用target.c中的targetresetinit函数,初始化目标板:设置remap,各部分时钟,加速模块和vic等
6.跳转到用户c程序入口main()处
此文来自: 马开东博客
转载请注明出处 网址:
ss="p0" style="text-align: margin-top: 0 margin-bottom: 0">3.修改uc/osii代码(完成移植)
1.要移植一个到一个特定的cpu体系结构上,并不是一件很容易的事情。对移植者有以下要求:
(1)对目标体系结构要有深入的了解:
&&&&&参考资料:arm公司。arm&architecture&reference&manual。
(2)对os原理要有深入的了解;
&参考资料:labrosse&j&jean。嵌入式实时uc/os-ii(第二版)。邵贝贝等译。
(3)对所使用的要有较深的了解;
& &参考资料:ads自带的和连接器的手册
(4)对需要移植的要有相当的了解;
&参考资料:labrosse&j&jean。嵌入式实时uc/os-ii(第二版)。邵贝贝等译。
(5)对具体使用的芯片也要一定的了解;
&参考资料:lpc2131的数据手册和使用手册
2.需要移植的文件有:os_cpu.h,os_cpu_a.asm,os_cpu_c.c,irqinc
(1).os_cpu.h文件:定义与无关的数据类型和堆栈的数据类型,以及一些开关中断的宏代码,例如:boolean,int8u等数据类型,os_enter_critical()和os_exit_critical()开关中断宏,os_stk_growth堆栈的增长方向,os_taslk_sw任务切换时执行的代码。源代码如下:
/****************************************copyright&(c)************************************
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&freshair嵌入式团队
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&团队
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&技术部&
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
**--------------文件信息-------------------------------------------------------------------
**文&&&件&&&名:&os_cpu.h
**创&&&建&&&人:&吴友强
**最后修改日期:&日
**描&&&&&&&&述:&&cos-ii在lpc210x上的移植代码cpu配置部分,用ads1.2编译
**--------------当前版本修订---------------------------------------------------------------
**&修改人:&吴友强
**&日 期:&日
**&描 述:&增加函数
**-----------------------------------------------------------------------------------------
******************************************************************************************/
#ifdef os_cpu_globals
#define os_cpu_ext
#define os_cpu_ext extern
/******************************************************************************************
*&&&&&&&&&&&&&&&&&&&&定义与无关的数据类型
******************************************************************************************/
typedef& unsigned&char&
typedef unsigned&char& int8u;
typedef& signed&char& int8s;
typedef& unsigned&short& int16u;
typedef& signed&short& int16s;
typedef unsigned&int int32u;
typedef signed&int int32s;
typedef float fp32;
typedef double fp64;
typedef unsigned&int os_
/******************************************************************************************
*&&&&&&&&&&&&&&&&&&&&与arm7体系结构相关的一些定义
******************************************************************************************/
#define os_critical_method 2 /*选择开、关中断的方式*/
__swi(0x00)&void&os_task_sw(void); /*任务级任务切换函数*/
__swi(0x01)&void&_osstarthighrdy(void); /*运行优先级最高的任务*/
__swi(0x02)&void&os_enter_critical(void); /*关中断*/
__swi(0x03)&void&os_exit_critical(void); /*开中断*/
__swi(0x80)&void&changetosysmode(void); /*任务切换到系统模式*/
__swi(0x81)&void&changetousrmode(void); /*任务切换到用户模式*/
__swi(0x82)&void&taskisarm(int8u&prio); /*任务代码是arm代码*/
__swi(0x83)&void&taskisthumb(int8u&prio); /*任务代码是thumb代码*/
__swi(0x40)&void&*getosfunctionaddr(int&index); /*获取系统服务函数入口*/
__swi(0x41)&void&*getusrfunctionaddr(int&index);/*获取自定义服务函数入口*/
__swi(0x42)&void&osisrbegin(void); /*中断开始处理*/
__swi(0x43)&void&osisrneedswap(void); /*判断中断是否需要切换*/
#define&os_stk_growth 1 /*堆栈是从上往下长的*/
#define usr32mode 0x10
#define sys32mode 0x1f
#define&noint 0x80
#ifndef user_using_mode
#define user_using_mode user32mode /*任务缺省模式*/
#ifndef os_self_en
#define&os_self_en 0 /*允许返回os与任务分别编译、固化*/&&
os_cpu_ext&int32u
/*关中断计数器(开关中断的信号量)*/
(2).os_cpu_c.c文件:ostaskstkinit()任务堆栈初始化函数和一些uc/os-ii在执行某些操作时调用的用户函数,一般为空,但是需此文来自: 马开东博客
转载请注明出处 网址:
要,避免编译警告。源代码如下:
/****************************************copyright&(c)************************************
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&freshair嵌入式团队
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&团队
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&技术部&
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
**--------------文件信息-------------------------------------------------------------------
**文&&&件&&&名:&os_cpu_c.c
**创&&&建&&&人:&吴友强
**最后修改日期:&日
**描&&&&&&&&述:&&cos-ii在lpc210x上的移植代码cpu配置部分,用ads1.2编译
**--------------当前版本修订---------------------------------------------------------------
**&修改人:&吴友强
**&日 期:&日
**&描 述:&增加函数
**-----------------------------------------------------------------------------------------
******************************************************************************************/
#define&&os_cpu_globals
#include&"config.h"
/******************************************************************************************
**&函数名称:&ostaskstkinit
**&功能描述:&任务堆栈初始化代码,本函数调用失败会使系统崩溃
**&输 入:&task&&:&任务开始执行的地址
**&&&&&&&&&pdata&:传递给任务的参数
**&&&&&&&&&ptos&&:任务的堆栈开始位置
**&&&&&&&&&opt&&&:附加参数,当前版本对于本函数无用,具体意义参见ostaskcreateext()的opt参数
**&输 出:&栈顶指针位置
**&作 者:&吴友强
**&日 期:&日
**-----------------------------------------------------------------------------------------
******************************************************************************************/
os_stk&*ostaskstkinit(void&(*task)(void&*pd),&void&*pdata,&os_stk&*ptos,&int16u&opt)
&&&&os_stk&*stk&;
&&&&opt&&&&=&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&'opt'&is&not&used,&prevent&warning&&&&&&&*/
&&&&stk&&&&=&&&&&&&&&&& /*&load&stack&pointer&&&&&&&*/
&&&&/*&build&a&context&for&the&new&task&*/
&&&&*stk&=&(os_stk) && /*&pc&*/
&&&&*--stk&=&(os_stk)&&&&&&& /*&lr&*/
&&&&*--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&=&0;&&&&&&&&&&&&&&&&&&&&&&&&&/*&r3&*/
&&&&*--stk&=&0;&&&&&&&&&&&&&&&&&&&&&&&&&/*&r2&*/
&&&&*--stk&=&0;&&&&&&&&&&&&&&&&&&&&&&&&&/*&r1&*/
&&&&*--stk&=&(unsigned&int)&&&&&&&/*&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]&为第四个参数
**&输 出:&根据功能而定
**&作 者:&吴友强
**&日 期:&日
**-----------------------------------------------------------------------------------------
******************************************************************************************/
#if os_self_en&&&0
extern int&const&_osfunctionaddr[];
extern int&const&_usrfunctionaddr[];
void&swi_exception(int&swi_num,&int&*regs)
switch&(swi_num)
case&0x02: /*&关中断函数os_enter_critical()*/
mrs r0,spsr
orr&r0,r0,#noint
msr spsr_c,r0
osentersum++;
case&0x03: /*&开中断函数os_exit_critical()*/
if&(--osentersum&==&0)
mrs&r0,spsr
bic&r0,r0,#noint
msr&spsr_c,r0
#if os_self_en&&&0
case&0x40: /*&返回指定系统服务函数的地址&&&&&&&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&函数地址存于数组_osfunctionaddr中*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&数组_osfunctionaddr需要另外定义&&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&regs[0]&为第一个参数,也是返回值&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&regs[1]&为第二个参数&&&&&&&&&&&&&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&regs[2]&为第三个参数&&&&&&&&&&&&&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&regs[3]&为第四个参数&&&&&&&&&&&&&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&仅有一个参数为系统服务函数的索引&*/
&&&&&&&&&&&&regs[0]&=&_osfunctionaddr[regs[0]];
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&case&0x41:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&返回指定用户的服务函数的地址&&&&&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&函数地址存于数组_usrfunctionaddr中*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&数组_usrfunctionaddr需要另外定义&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&regs[0]&为第一个参数,也是返回值&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&regs[1]&为第二个参数&&&&&&&&&&&&&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&regs[2]&为第三个参数&&&&&&&&&&&&&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&regs[3]&为第四个参数&&&&&&&&&&&&&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&仅有一个参数为用户服务函数的索引&*/
&&&&&&&&&&&&regs[0]&=&&_usrfunctionaddr[regs[0]];
&&&&&&&&&&&&
&&&&&&&&case&0x42:&&&&&&&&&&&&&&&&&&&&&&/*&中断开始处理&*/
&&&&&&&&&&&&osintnesting++;
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&case&0x43:&&&&&&&&&&&&&&&&&&&&&&/*&&判断中断是否需要切换&&&&&&&&&&&&&*/
&&&&&&&&&&&&if&(ostcbhighrdy&==&ostcbcur)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&regs[0]&=&0;
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&regs[0]&=&1;
&&&&&&&&&&&&}
&&&&&&&&&&&&
case&0x80: /*&任务切换到系统模式&*/
mrs&r0,spsr
bic&r0,r0,#0x1f
orr&r0,r0,#sys32mode
msr&spsr_c,r0
case&0x81: /*&任务切换到用户模式&*/
mrs&r0,spsr
bic&r0,r0,#0x1f
orr&r0,r0,#usr32mode
msr&spsr_c,r0
case&0x82: /*&任务是arm代码&*/
if&(regs[0]&&=&os_lowest_prio)
ptcb&=&ostcbpriotbl[regs[0]];
if&(ptcb&!=&null)
ptcb-&ostcbstkptr[1]&&=&~(1&&&&5);
case&0x83: /*&任务是thumb代码&*/
if&(regs[0]&&=&os_lowest_prio)
ptcb&=&ostcbpriotbl[regs[0]];
if&(ptcb&!=&null)
ptcb-&ostcbstkptr[1]&|=&(1&&&&5);
/******************************************************************************************
**&函数名称:&osstarthighrdy
**&功能描述:&uc/os-ii启动时使用osstarthighrdy运行第一个任务,
**&&&&&&&&&&&实质是产生swi&1指令
**&作 者:&吴友强
**&日 期:&日
**-----------------------------------------------------------------------------------------
******************************************************************************************/
void&osstarthighrdy(void)
&&&&_osstarthighrdy();
/*&以下为一些钩子函数,全部为空函数。*/
#if&os_cpu_hooks_en
#if&os_version&&&203
void&osinithookbegin&(void)
#if&os_version&&&203
void&osinithookend&(void)
void&ostaskcreatehook&(os_tcb&*ptcb)
&&&&ptcb&=&&&&&&&&&&&&&&&&&&&&&&&&/*&prevent&compiler&warning&&&*/
void&ostaskdelhook&(os_tcb&*ptcb)
&&&&ptcb&=&&&&&&&&&&&&&&&&&&&&&&&&/*&prevent&compiler&warning&&&*/
void&ostaskswhook&(void)
void&ostaskstathook&(void)
#if&os_version&&&203
void&ostcbinithook&(os_tcb&*ptcb)
&&&&ptcb&=&&&&&&&&&&&&&&&&&&&&&&&&/*&prevent&compiler&warning&&&&&*/
#if&os_version&&=&251
void&ostaskidlehook&(void)
(3)os_cpu_a.asm文件:进入多任务环境时,应运行优先级最高的任务osstarthighrdy()函数,中断退出时的任务切换函数osintctxsw()和时钟节拍中断服务程序;为使用ads1.2的管理这个文件改名为os_cpu_a.s。源代码如下:
;/****************************************copyright&(c)************************************
;**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&freshair嵌入式团队
;**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&团队
;**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&技术部&
;**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;**--------------文件信息------------------------------------------------------------------
;**文&&&件&&&名:&os_cpu_a.s
;**创&&&建&&&人:&吴友强
;**最后修改日期:&日
;**--------------当前版本修订--------------------------------------------------------------
;**&修改人:&吴友强
;**&日 期:&日
;**----------------------------------------------------------------------------------------
;*****************************************************************************************/
;定义系统模式堆栈的大小
svc_stack_legth equ 32
noint equ 0x80
usr32mode equ 0x10
svc32mode equ 0x13
sys32mode equ 0x1f
irq32mode equ 0x12
fiq32mode equ 0x11
;t_bit用于检测进入异常前cpu是否处于thumb状态
t_bit equ 0x20
area |subr|,code,readonly
import&&ostcbcur&&&&&&&&&&&&&&&&&&&&;指向当前任务tcb的指针
&&&&&&&&&&&&import&&ostcbhighrdy&&&&&&&&&&&&&&&&;指向将要运行的任务tcb的指针
&&&&&&&&&&&&import&&ospriocur&&&&&&&&&&&&&&&&&&&;当前任务的优先级
&&&&&&&&&&&&import&&ospriohighrdy&&&&&&&&&&&&&&&;将要运行的任务的优先级
&&&&&&&&&&&&import&&ostaskswhook&&&&&&&&&&&&&&&&;任务切换的钩子函数
&&&&&&&&&&&&import&&osrunning&&&&&&&&&&&&&&&&&&&;uc/os-ii运行标志
&&&&&&&&&&&&import&&osentersum&&&&&&&&&&&&&&&&&&;关中断计数器(关中断信号量)
&&&&&&&&&&&&import&&swi_exception&&&&&&&&&&&&&&&;软中断异常处理程序&&&&&&&&&
&&&&&&&&&&&&export&&__osstarthighrdy&&&&&&&&&&&&
&&&&&&&&&&&&export&&osintctxsw&&&&&&&&&&&&&&&&&&;中断退出时的入口,参见startup.s中的irq_handler
&&&&&&&&&&&&export&&softwareinterrupt&&&&&&&&&&&;软中断入口
&&&&&&&&&&&&
&&&&&&&&&&&&
;/*****************************************************************************************
;**&函数名称:&softwareinterrupt
;**&功能描述:&软件中断,用于提供一些系统服务
;**&输 入:&&&依功能而定
;**&输 出&:&&依功能而定
;**&调用模块:&swi_exception
;**&作 者:&吴友强
;**&日 期:&日
;**----------------------------------------------------------------------------------------
;*****************************************************************************************/
softwareinterrupt
&&&&&&&&ldr&&&&&sp,&stacksvc&&&&&&&&&&&&;&重新设置堆栈指针
&&&&&&&&stmfd&&&sp!,&{r0-r3,&r12,&lr}
&&&&&&&&mov&&&&&r1,&sp&&&&&&&&&&&&&&&&&&;&r1指向参数存储位置
&&&&&&&&mrs&&&&&r3,&spsr
&&&&&&&&tst&&&&&r3,&#t_bit&&&&&&&&&&&&&&;&中断前是否是thumb状态
&&&&&&&&ldrneh&&r0,&[lr,#-2]&&&&&&&&&&&&;&是:&取得thumb状态swi号
&&&&&&&&bicne&&&r0,&r0,&#0xff00
&&&&&&&&ldreq&&&r0,&[lr,#-4]&&&&&&&&&&&&;&否:&取得arm状态swi号
&&&&&&&&biceq&&&r0,&r0,&#0xff000000
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&r0&=&swi号,r1指向参数存储位置
&&&&&&&&cmp&&&&&r0,&#1
&&&&&&&&ldrlo&&&pc,&=osintctxsw
&&&&&&&&ldreq&&&pc,&=__osstarthighrdy&&&;&swi&0x01为第一次任务切换
&&&&&&&&bl&&&&&&swi_exception&&&&&
&&&&&&&&ldmfd&&&sp!,&{r0-r3,&r12,&pc}^&&&&&&&&
stacksvc&&&&&&&&&&&dcd&&&&&(svcstackspace&+&svc_stack_legth&*&4&-&4)
;/*****************************************************************************************
;**&函数名称:&osintctxsw
;**&功能描述:&中断退出时的入口
;**&输 入:&&&r3&&&&:当前任务的状态寄存器cpsr(即spsr的值)
;**&&&&&&&&&&&r4-r12:当前任务的r4-r11
;**&&&&&&&&&&&当前处理器模式的堆栈结构(出栈次序):r0-r3、r12、pc(当前任务的)
;**&输 出&:&&无
;**&全局变量:&ospriocur,ospriohighrdy,ospriocur,ospriohighrdy
;**&作 者:&吴友强
;**&日 期:&日
;**----------------------------------------------------------------------------------------
;*****************************************************************************************/
osintctxsw
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;下面为保存任务环境
&&&&&&&&ldr&&&&&r2,&[sp,&#20]&&&&&&&&&&&&&&&&&&&&&&&;获取pc
&&&&&&&&ldr&&&&&r12,&[sp,&#16]&&&&&&&&&&&&&&&&&&&&&&;获取r12
&&&&&&&&mrs&&&&&r0,&cpsr
&&&&&&&&msr&&&&&cpsr_c,&#(noint&|&sys32mode)
&&&&&&&&mov&&&&&r1,&lr
&&&&&&&&stmfd&&&sp!,&{r1-r2}&&&&&&&&&&&&&&&&&&&&&&&&;保存lr,pc
&&&&&&&&stmfd&&&sp!,&{r4-r12}&&&&&&&&&&&&&&&&&&&&&&&;保存r4-r12
&&&&&&&&msr&&&&&cpsr_c,&r0
&&&&&&&&ldmfd&&&sp!,&{r4-r7}&&&&&&&&&&&&&&&&&&&&&&&&;获取r0-r3
&&&&&&&&add&&&&&sp,&sp,&#8&&&&&&&&&&&&&&&&&&&&&&&&&&;出栈r12,pc&&&&&&&&
&&&&&&&&msr&&&&&cpsr_c,&#(noint&|&sys32mode)
&&&&&&&&stmfd&&&sp!,&{r4-r7}&&&&&&&&&&&&&&&&&&&&&&&&;保存r0-r3&&&&&&&&
&&&&&&&&ldr&&&&&r1,&=osentersum&&&&&&&&&&&&&&&&&&&&&;获取osentersum
&&&&&&&&ldr&&&&&r2,&[r1]
&&&&&&&&stmfd&&&sp!,&{r2,&r3}&&&&&&&&&&&&&&&&&&&&&&&;保存cpsr,osentersum
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;保存当前任务堆栈指针到当前任务的tcb
&&&&&&&&ldr&&&&&r1,&=ostcbcur
&&&&&&&&ldr&&&&&r1,&[r1]
&&&&&&&&str&&&&&sp,&[r1]
&&&&&&&&bl&&&&&&ostaskswhook&&&&&&&&&&&&&&&&&&&&&&&&;调用钩子函数
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;ospriocur&&=&ospriohighrdy
&&&&&&&&ldr&&&&&r4,&=ospriocur
&&&&&&&&ldr&&&&&r5,&=ospriohighrdy
&&&&&&&&ldrb&&&&r6,&[r5]
&&&&&&&&strb&&&&r6,&[r4]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;ostcbcur&&=&ostcbhighrdy
&&&&&&&&ldr&&&&&r6,&=ostcbhighrdy
&&&&&&&&ldr&&&&&r6,&[r6]
&&&&&&&&ldr&&&&&r4,&=ostcbcur
&&&&&&&&str&&&&&r6,&[r4]
osintctxsw_1
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;获取新任务堆栈指针
&&&&&&&&ldr&&&&&r4,&[r6]
&&&&&&&&add&&&&&sp,&r4,&#68&&&&&&&&&&&&&&&&&&&&&&&&&;17寄存器cpsr,osentersum,r0-r12,lr,sp
&&&&&&&&ldr&&&&&lr,&[sp,&#-8]
&&&&&&&&msr&&&&&cpsr_c,&#(noint&|&svc32mode)&&&&&&&&;进入管理模式
&&&&&&&&mov&&&&&sp,&r4&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;设置堆栈指针
&&&&&&&&ldmfd&&&sp!,&{r4,&r5}&&&&&&&&&&&&&&&&&&&&&&&;cpsr,osentersum
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;恢复新任务的osentersum
&&&&&&&&ldr&&&&&r3,&=osentersum
&&&&&&&&str&&&&&r4,&[r3]
&&&&&&&&msr&&&&&spsr_cxsf,&r5&&&&&&&&&&&&&&&&&&&&&&&;恢复cpsr
&&&&&&&&ldmfd&&&sp!,&{r0-r12,&lr,&pc&}^&&&&&&&&&&&&&;运行新任务
;/*****************************************************************************************
;**&函数名称:&__osstarthighrdy
;**&功能描述:&uc/os-ii启动时使用osstarthighrdy运行第一个任务,
;**&&&&&&&&&&&osstarthighrdy会调用__osstarthighrdy
;**&输 入:&&&无
;**&输 出&:&&无
;**&全局变量:&osrunning,ostcbcur,ostcbhighrdy,osentersum
;**&调用模块:&ostaskswhook
;**&作 者:&吴友强
;**&日 期:&日
;**----------------------------------------------------------------------------------------
;*****************************************************************************************/
__osstarthighrdy
&&&&&&&&msr&&&&&cpsr_c,&#(noint&|&sys32mode)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;告诉uc/os-ii自身已经运行
&&&&&&&&ldr&&&&&r4,&=osrunning
&&&&&&&&mov&&&&&r5,&#1
&&&&&&&&strb&&&&r5,&[r4]
&&&&&&&&bl&&&&&&ostaskswhook&&&&&&&&&&&&&&&&&&&&;调用钩子函数
&&&&&&&&ldr&&&&&r6,&=ostcbhighrdy
&&&&&&&&ldr&&&&&r6,&[r6]
&&&&&&&&b&&&&&&&osintctxsw_1
&&&&&&&&area&&&&swistacks,&data,&noinit,align=2
svcstackspace&&&&&&space&&&svc_stack_legth&*&4&&;管理模式堆栈空间
(4)irq.inc定义了一个宏汇编,并且是uc/os-ii&for&arm7通用的中断服务程序的汇编与c语言接口代码,需要自己编写。源代码如下:
;/****************************************copyright&(c)************************************
;**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&freshair嵌入式团队
;**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&团队
;**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&技术部&
;**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;**--------------文件信息------------------------------------------------------------------
;**文&&&件&&&名:&irq.inc
;**创&&&建&&&人:&吴友强
;**最后修改日期:&日
;**描&&&&&&&&述:&定义irq汇编接口代码宏
;**--------------历史版本信息--------------------------------------------------------------
;**&创建人:&吴友强
;**&版&&本:&v1.0
;**&日 期:&日
;*****************************************************************************************/
noint&&&&&&&equ&0x80
usr32mode&&&equ&0x10
svc32mode&&&equ&0x13
sys32mode&&&equ&0x1f
irq32mode&&&equ&0x12
fiq32mode&&&equ&0x11
;引入的外部标号在这声明
&&&&&&&&import&&osintctxsw&&&&&&&&&&&&&&&&&&&&&&;任务切换函数
&&&&&&&&import&&osintexit&&&&&&&&&&&&&&&&&&&&&&&;中断退出函数
&&&&&&&&import&&ostcbcur
&&&&&&&&import&&ostcbhighrdy
&&&&&&&&import&&osintnesting&&&&&&&&&&&&&&&&&&&&;中断嵌套计数器
&&&&&&&&import&&stackusr
&&&&&&&&import&&osentersum
&&&&code32
&&&&area&&&&irq,code,readonly
$irq_label&handler&$irq_exception_function
&&&&&&&&export&&$irq_label&&&&&&&&&&&&&&&&&&&&&&;&输出的标号
&&&&&&&&import&&$irq_exception_function&&&&&&&&&;&引用的外部标号
$irq_label
&&&&&&&&sub&&&&&lr,&lr,&#4&&&&&&&&&&&&&&&&&&&&&&;&计算返回地址
&&&&&&&&stmfd&&&sp!,&{r0-r3,&r12,&lr}&&&&&&&&&&&;&保存任务环境
&&&&&&&&mrs&&&&&r3,&spsr&&&&&&&&&&&&&&&&&&&&&&&&;&保存状态
&&&&&&&&stmfd&&&sp,&{r3,&sp,&lr}^&&&&&&&&&&&&&&&;&保存用户状态的r3,sp,lr,注意不能回写
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&如果回写的是用户的sp,所以后面要调整sp
&&&&&&&&ldr&&&&&r2,&&=osintnesting&&&&&&&&&&&&&&;&osintnesting++
&&&&&&&&ldrb&&&&r1,&[r2]
&&&&&&&&add&&&&&r1,&r1,&#1
&&&&&&&&strb&&&&r1,&[r2]
&&&&&&&&sub&&&&&sp,&sp,&#4*3&&&&&
&&&&&&&&msr&&&&&cpsr_c,&#(noint&|&sys32mode)&&&&;&切换到系统模式
&&&&&&&&cmp&&&&&r1,&#1
&&&&&&&&ldreq&&&sp,&=stackusr
&&&&&&&&bl&&&&&&$irq_exception_function&&&&&&&&&;&调用c语言的中断处理程序
&&&&&&&&msr&&&&&cpsr_c,&#(noint&|&sys32mode)&&&&;&切换到系统模式
&&&&&&&&ldr&&&&&r2,&=osentersum&&&&&&&&&&&&&&&&&;&osentersum,使osintexit退出时中断关闭
&&&&&&&&mov&&&&&r1,&#1
&&&&&&&&str&&&&&r1,&[r2]
&&&&&&&&bl&&&&&&osintexit
&&&&&&&&ldr&&&&&r2,&=osentersum&&&&&&&&&&&&&&&&&;&因为中断服务程序要退出,所以osentersum=0
&&&&&&&&mov&&&&&r1,&#0
&&&&&&&&str&&&&&r1,&[r2]
&&&&&&&&msr&&&&&cpsr_c,&#(noint&|&irq32mode)&&&&;&切换回irq模式
&&&&&&&&ldmfd&&&sp,&{r3,&sp,&lr}^&&&&&&&&&&&&&&&;&恢复用户状态的r3,sp,lr,注意不能回写
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&如果回写的是用户的sp,所以后面要调整sp
&&&&&&&&ldr&&&&&r0,&=ostcbhighrdy
&&&&&&&&ldr&&&&&r0,&[r0]
&&&&&&&&ldr&&&&&r1,&=ostcbcur
&&&&&&&&ldr&&&&&r1,&[r1]
&&&&&&&&cmp&&&&&r0,&r1
&&&&&&&&add&&&&&sp,&sp,&#4*3&&&&&&&&&&&&&&&&&&&&;&
&&&&&&&&msr&&&&&spsr_cxsf,&r3
&&&&&&&&ldmeqfd&sp!,&{r0-r3,&r12,&pc}^&&&&&&&&&&;&不进行任务切换
&&&&&&&&ldr&&&&&pc,&=osintctxsw&&&&&&&&&&&&&&&&&;&进行任务切换
2.注意事项:
(1)os_stk_growth中指定堆栈的生长方式:为1表示堆栈从下往上生长,0表示堆栈从上往下生长。
(2)在ostaskstkint初始化堆栈的函数必须保存cpu相关资源,如寄存器。
3.其他的都在移植源代码中有相关注释及说明。
&&&三.完成项目
1.源代码编译通过,完成了所有的移植工作,项目也达到预期的效果,正常的跑起来了。
2.通过的测试,下面是运行成功后的第一个应用的主程序:
/****************************************copyright(c)**************************************
**&&&&&&&&&&&&&&&&&&&&&&&&&&& freshair嵌入式团队
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&freshair
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&http://www.freshair.com
**--------------file&info------------------------------------------------------------------
**&file&name: main.c
**&last&modified&date:&&
**&created&by: 吴友强
**created&date:日0:00
**&version: v1.0
**&descriptions:成功移植ucosii后的第一个:gpio输出实验
******************************************************************************************/
#include&"config.h"
#include&"stdlib.h"
#define&led1 (1&&&&18)
#define&led2 (1&&&&19)
#define taskstklengh 64 //定义用户任务0的堆栈长度
#define&taskled1stksize 128 //定义用户任务1的堆栈长度
#define&taskled2stksize&128 //定义用户任务2的堆栈长度
os_stk taskstk&[taskstklengh]; //定义用户任务0的堆栈
os_stk taskled1stk[taskled1stksize];//定义用户任务1的堆栈
os_stk taskled2stk[taskled2stksize];//定义用户任务2的堆栈
void& task0(void&*pdata); //task0&任务0
void taskled1(void&*data);
void taskled2(void&*data);
int&main&(void)
osinit&();
ostaskcreate&(task0,(void&*)0,&&taskstk[taskstklengh&-&1],&2);
osstart&();
/******************************************************************************************&&&&&&&&&&&&&&&&&&&&&&&&&&&& task0&任务0
******************************************************************************************/
void&task0 (void&*pdata)
targetinit&();
ostaskcreate(taskled1,&(void&*)0,&&taskled1stk[taskled1stksize&-&1],&3);
ostaskcreate(taskled2,&(void&*)0,&&taskled2stk[taskled2stksize&-&1],&4);
ostimedly(10);
void&taskled1(void&*pdata)
pinsel2&=&pinsel2&&&(~0x08);
io1dir&|=&led1;
io1set&=&led1;
io1clr&=&led1;
ostimedly(os_ticks_per_sec&/&4);
io1set&=&led1;
ostimedly(os_ticks_per_sec&/&2);
void&taskled2(void&*pdata)
pinsel2&=&pinsel2&&&(~0x08);
io1dir&|=&led2;
io1set&=&led2;
io1clr&=&led2;
ostimedly(os_ticks_per_sec&/&2);
io1set&=&led2;
ostimedly(os_ticks_per_sec&/&1);
四.项目经验总结及心得
1.通过长期的学习相关知识和不断的尝试编码及测试,终于成功的所有的源代码通过编译,在看到没有错误提示的那一刻是多么的兴奋无法形容。
2.虽然这个项目成功并且是出色的完成了,但这只是开始,是以后做项目的开端,可以把这个项目运用到以后项目中去
3.通过自学和不断的摸索让自己的自学能力有很大幅度提高,项目的成功完成也让我对自己未来的学习更有信心,为自己下一步学习linux和arm9及arm10或arm11打下了良好的基础。
4.通过&&嵌入式实时&c/os-ⅱ(第二版)&&阅读让我基本掌握了&c/os-ⅱ这个,主要学习里面的设计思想,这个属于rtos,对于这一类设计思想有了一个很好的了解,更重要的一点在阅读这个系统的源代码时吸收了许多很好的编程风格和编程思路,当然还有更多的编程技巧。
5.移植过程中遇到主要问题解决:
(1)产生#error这个地方错误,通过查看的文档,通过加入-ep编译选项成功解决。
(2)头文件包含错误,主要是文件组织结构没有弄好,最后还是下定决心从新开始,通过解决一个两个等的编译错误最终成功搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
基于ARM7LPC2131平台的μC/OS-Ⅱ的移植_博客园相关文章
博客园_总排行榜
博客园_最新
博客园_月排行榜
博客园_周排行榜
博客园_日排行榜

我要回帖

更多关于 stmfd ldmfd 的文章

 

随机推荐