除非你的程序特别简单,否则一般是不可以的
首先要明确启动代码的作用,一般启动代码中包含异常中断入口、堆栈设置、系统及外设时钟设置等,比如你的ads代码是用在ARM7下,并且使用了嵌套中断以及SVC,因为ARM7并不支持硬件中断嵌套,所以要在启动代码中添加嵌套保护代码;使用SVC的话要在启动代码中用汇编取出标号等等,这些东西在keil自带的启动代码中是没有的
但是,keil自带的启动代码有一个非常大的优势:图形化界面来配置启动代码如下图所示:
所以一旦你对keil的启动代码有所了解后,配置起来非常方便。
最好的方法是你读懂ADS下的启动代码,然后看一下keil自带的启动代码有哪些是需要改进的,然后结合ads下的启动代码来修改一下,这样是最快的。
推荐一:OS_CPUH
1、定义与编译器无光的数据类型
只是按照不同的编译器编写对应的数据类型的typedef 对应于ARM7的数据类型的编写如下
typedef unsigned char BOOLEAN;/ 布尔变量/
typedef unsigned char INT8U; / 无符号8位整型变量/
typedef signed char INT8S; / 有符号8位整型变量/
typedef unsigned short INT16U; / 无符号16位整型变量/
typedef signed short INT16S; / 有符号16位整型变量/
typedef unsigned int INT32U; / 无符号32位整型变量/
typedef signed int INT32S; / 有符号32位整型变量/
typedef float FP32; /单精度浮点数(32Bit)/
typedef double FP64; /双精度浮点数(64Bit)/
/在上面定义的数据类型中按照ARM7的堆栈宽度选择INT32U/
typedef INT32U OS_STK; / 堆栈是32位宽度/
接下来一部分是为了兼容低版本UCOS的数据类型所编写的代码,在UCOS-II中暂不考虑
2 与处理器相关的代码
先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式 2
#define OS_CRITICAL_METHOD 2/选择开,关中断的方式 /
接下来的一段是我暂时还没有完全搞懂的一部分,只知道是设定了12个软件中断的函数,当调用这
些函数之前都会执行对应中断号的事情。具体的看到后面应该能完全搞懂软件中断的实现方式,
该段代码在后面的文件中会有具体的解释,这里暂时不看
定义堆栈的生长方式,ARM7内核支持两种生长方式,但是ADS的C语言编译器只支持从上往下的生
长方式,因此:
#define OS_STK_GROWTH 1 / 堆栈是从上往下长的,0-从下往上的生长方式 /
最后几行分别定义了用户模式01和系统模式1f以及IRQ中断禁止的指令80三个立即数,方便调用
还有两个预定义往后看应该知道作用,暂不考虑,不是很重要
软中断:
中断不返回形式:
void _swi(swi_num) swi_name(arguments);
返回一个结果到R0中
int _swi(swi_num) swi_name(arguments);
最多可以返回四个结果R0-R3到一个结构struct type{ int a,b,c,d}中
type(返回类型) _value_in_regs(返回多个结果的修饰符) _swi(swi_num) swi_name(arguments);
在ARM中实现软中断的方法我在blog里面搜了很多文章也没有看到讲的通俗一点的,还是自己看
ARM的移植代码吧首先定义了一堆软中断的中断号,其中0和1的中断服务子程序是用汇编编写的,
其他的都是在c语言编写的中断服务子程序SWI_Exception中。
__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(0x40) void GetOSAddr(int Index);
/ 获取系统服务函数入口 /
__swi(0x41) void GetUsrAddr(int Index);
/ 获取自定义服务函数入口 /
__swi(0x42) void OSISRBegin(void);
/ 中断开始处理 /
__swi(0x43) int OSISRNeedSwap(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 /
比如在程序运行到调用OS_TASK_SW(void)函数时,就产生软件中断,然后就进入中断服务子程序,
按照什么指令走呢?恩,就按照下面这个代码,这个代码是将软件中断异常处理程序挂接到内核
的作用的,是在启动代码中实现的:
LDR PC,SWI_Addr
SWI_Addr DCD SoftwareInterrupt
因此当产生软中断之后PC就跳到了SoftwareInterrupt,这时就算真正进入了软件异常中断处理部
分了,然后就是执行下面的汇编代码SoftwareInterrupt
LDR SP, StackSvc
/重新设置堆栈指针/
STMFD SP!, {R0-R3, R12, LR}
/保存 R0,R1,R2,R3,R12,LR(R14),注意为什么只保存这几个
寄存器呢,因为R4-R11存储局部变量,编译器自动保护他们/
MOV R1, SP / R1指向参数存储位置 /
MRS R3, SPSR /保存管理模式的状态寄存器/
TST R3, #T_bit / 中断前是否是Thumb状态 /
LDRNEH R0, [LR,#-2] / 若是,取得Thumb状态SWI号/
BICNE R0, R0, #0xff00 /THUMB指令SWI功能号为8位 /
LDREQ R0, [LR,#-4] / 为零即ARM指令取得SWI号 /
BICEQ R0, R0, #0xFF000000
/在ARM指令集中SWI功能号为24位所以高8位清零r0=SWI号/
CMP R0, #1 /
LDRLO PC, =OSIntCtxSw / 疑惑ing /
/ 功能号为0到OSIntCtxSw执行中断任务切换函数 /
LDREQ PC, =__OSStartHighRdy/SWI为1第一次任务切换/
BL SWI_Exception /否则进入c编写的中断函数 /
LDMFD SP!, {R0-R3, R12, PC}/R0-R3,R12,LR出栈 /
StackSvc
DCD (SvcStackSpace + SVC_STACK_LEGTH 4 - 4)
怎么进入c编写的中断服务子程序SWI_Exception呢?通过下面的申明
IMPORT SWI_Exception ;软中断异常处理程序
表示将c程序中的该函数挂接到此段汇编代码中,同样的道理
EXPORT __OSStartHighRdy
EXPORT OSIntCtxSw ;中断退出时的入口
参见startups中的IRQ_Handler
EXPORT SoftwareInterrupt ;软中断入口上面的申明是将该段汇编代码挂接到外面,
因此在外部可以直接调用函数名
继续看OS_CPU_AS的其他部分代码,就是两个软件异常中断处理函数OSIntCtxSw和OSStarHighRdyOSIntCtxSw代码是中断服务子程序使得更高优先级的任务进入就绪状态后,中断返回后需要切换到该任务时调用的,这是被切换的任务的CPU寄存器的值已经在响应中断后存入了堆栈中,因此,这里不需要重复保存了直接切换任务即可,具体过程看代码OSIntCtxSw
;下面为保存任务环境 ;当响应软件异常中断后进入了系统模式,在上面的代码中我们可以看到,进入系统模式时保存的堆栈结构从顶到底依次是:R0,R1,R2,R3,R12,LR,而在用户模式中任务的堆栈结构应该是:OsEnterSum,CPSR,RO-12,LR,PC,所以在进行软件中断任务切换之前先要保存原来任务的堆栈结构。
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
MSR CPSR_c, #(NoInt | SYS32Mode) ;调整到管理模式
;告诉uC/OS-II自身已经运行
LDR R4, =OSRunning
MOV R5, #1
STRB R5, [R4] ;标记多任务运行标记为真 BL OSTaskSwHook ;调用钩子函数,可以运行用户自定义的函数 LDR R6, =OSTCBHighRdy ;R6存有最高优先级的就绪任务的控制块地址
LDR R6, [R6]
B OSIntCtxSw_1 ;转到前面编写的中断返回函数块的任务跳转部分的代码,因为这两个函数都要用到这部分代码,进入这段代码之前高优先级的就绪任务的任务控制快地址存在R6中。 AREA SWIStacks, DATA, NOINIT,ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH 4 ;管理模式堆栈空间 OSIntCtxSw_1的代码:OSIntCtxSw_1
;获取新任务堆栈指针
LDR R4, [R6] ;任务控制块的堆栈指针放在R6中,现在放在R4中
ADD SP, R4, #68 ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
LDR LR, [SP, #-8]
MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式
MOV SP, R4 ;设置堆栈指针,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 }^ ;运行新任务,恢复现场,异常处理返回;中断返回指令的寄存器列表其中必须包括PC后的^符号,表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时,CPSR也得到恢复。这里使用的堆栈指针SP是属于异常模式的寄存器,每个异常模式有自己的堆栈指针。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
;下面为保存任务环境
LDR R2, [SP, #20] ;获取PC(LR)
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] ;把OSPrioHighRdy最高优先级的就绪任务传给OSPrioCur
;OSTCBCur <= OSTCBHighRdy
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
LDR R4, =OSTCBCur
STR R6, [R4] ;将最高优先级的任务控制块指针传给当前任务控制块指针
关于中断和时钟节拍,UCOS-II对于ARM7通用的中断服务程序的汇编与c函数接口如下:MACRO和MEND伪指令用于宏定义,MACRO标识宏定义的开始,MEND标识宏定义的结束。定义之后在程序中就可以通过宏指令多次调用该段代码MACRO
$IRQ_Label HANDLER $IRQ_Exception_ EXPORT $IRQ_Label ; 输出的标号
IMPORT $IRQ_Exception_ ; 引用的外部标号$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, #43
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式
CMP R1, #1
LDREQ SP, =StackUsr
BL $IRQ_Exception_ ; 调用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, #43 ;
MSR SPSR_cxsf, R3
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
LDR PC, =OSIntCtxSw ; 进行任务切换
MEND二:OS_CPU_CC 个文件中要求用户编写10个简单的C函数,但是只有1个函数是必要的,其余的函数必须声明,但不一定要包含任何代码,大致看了一下作用好像是用来调试之类的。唯一要编写的是OSTaskStkInit() OSTaskStkInit()函数的功能是初始化任务的栈结构,任务的堆栈结构与CPU的体系结构、编译器有密切的关联。从ARM的结构可以写出如下的栈结构:程序计数器PC,程序链接器LR,R12-R1,R0用于传递第一个参数pdata,CPSR/SPSR,关中断计数器(用于计算关中断的次数,这样就实现了中断的嵌套),返回的地址指针是指向的最后一个存入的数据,而不是一个空地址。软件中断异常SWI服务程序C语言部分 void SWI_Exception(int SWI_Num, int Regs):参数SWI_Num对应前面文件中定义的功能号,其中0、1号的功能在后面的文件中定义,这里只定义了其他10个功能。 2、3分别对应关中断和开中断 关中断:MRS R0, SPSR //在软件中断的时候直接对程序状态保存寄存器SPSR *** 作也就是对CPSR的 *** 作
ORR R0, R0, #NoInt //在汇编语言中对寄存器的对应位置位用ORR,清零用BIC
MSR SPSR_c, R0 //SPSR_c表示的是只改变SPSR的控制段的8位代码,其他三段_f,_s,_x中标志位在_f段,其他为保留位 开中断:MRS R0, SPSR //在开中断中基本与上面相同,只是ORR改成BIC清零
BIC R0, R0, #NoInt
MSR SPSR_c, R 由于需要实现中断嵌套,所以只有当关中断的计数器减为0的时候才能够开中断,而且每次关中断的时候该计数器都应该加1。另外,插入汇编语言时用_asm指令。 80、81、82、83分别对应系统模式、用户模式、ARM指令集、THUMB指令集 系统模式:MRS R0, SPSR
BIC R0, R0, #0x1f //先将控制模式的低5位清零
ORR R0, R0, #SYS32Mode //设置成系统模式的1F
MSR SPSR_c, R0 用户模式:MRS R0, SPSR
BIC R0, R0, #0x1f
ORR R0, R0, #USR32Mode //设置成用户模式的10
MSR SPSR_c, R0 ARM指令集与THUMB指令集的代码如下: ptcb = OSTCBPrioTbl[Regs[0]];
if (ptcb != NULL)
{
ptcb -> OSTCBStkPtr[1] &= ~(1 << 5);
} ptcb = OSTCBPrioTbl[Regs[0]];
if (ptcb != NULL)
{
ptcb -> OSTCBStkPtr[1] |= (1 << 5);
} 昨天就是看到这里,出现了一个意识到是不能忽悠的地方就是UCOS里面的任务控制块OS_TCB的概念,因此今天的任务就是把这部分看看。。。 大概回忆了一下昨天晚上的工作,开始今天的工作吧
一点一点来,什么不会就学什么,都不会就都学。。。没有问题只要你肯努力。。。。。。__OSStartHighRdy
MSR CPSR_c, #(NoInt | SYS32Mode) ;MSR:在ARM中只有MSR能够直接设置状态寄存器CPSR或SPSR,可以是立即数或者源寄存器,NoInt是禁止中断,SYS32Mode是系统模式
;告诉uC/OS-II自身已经运行
LDR R4, =OSRunning ;OSRunning正在运行多任务的标志,=OSRunning是把OSRunning的地址加载到R4,R4里存的是一个地址。。。
MOV R5, #1
STRB R5, [R4] ;将R5存储到R4存的地址的变量即OSRunning中,也就是将OSRunning置1 BL OSTaskSwHook ;调用钩子函数,OSTaskSwHook 是用于扩展的,在任务切换的时候执行用户自己定义的功能。 LDR R6, =OSTCBHighRdy ;OSTCBHighRdy指向最高优先级任务的控制块TCB的指针!!!将放指针的地址放到R6中。
LDR R6, [R6] ;将R6地址处的数据读出即OSTCBHighRdy的地址放到R6中
B OSIntCtxSw_1 ;跳转到OSIntCtxSw_1 AREA SWIStacks, DATA, NOINIT,ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH 4 ;管理模式堆栈空间继续昨天没有看完的代码OSIntCtxSw
;下面为保存任务环境
LDR R2, [SP, #20] ;获取PC,放入R2
LDR R12, [SP, #16] ;获取R12,//R12存的什么东西啊???
MRS R0, CPSR MSR CPSR_c, #(NoInt | SYS32Mode) ;进入系统模式并禁止中断
MOV R1, LR ;R1放LR值
STMFD SP!, {R1-R2} ;保存LR,PC,将R1,R2存入SP
STMFD SP!, {R4-R12} ;保存R4-R12,将R4-12存入SP 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] ;把OSTCBHighRdy指向最高优先级任务的控制块TCB的指针给R4
ADD SP, R4, #68 ;17寄存器:CPSR,OsEnterSum,R0-R12,LR,SP
LDR LR, [SP, #-8] ;取出LR放到LR
MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式并且保持禁止中断
MOV SP, R4 ;设置堆栈指针 LDMFD SP!, {R4, R5} ;CPSR,OsEnterSum。LDMFD数据出栈,放入R4,R5
;恢复新任务的OsEnterSum
LDR R3, =OsEnterSum ;OsEnterSum的地址存入R3
STR R4, [R3] ;把R4的值赋给OsEnterSum
MSR SPSR_cxsf, R5 ;恢复CPSR;在管理模式里是修改SPSR
LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务 ,恢复现场,异常处理返回
个人理解中断嵌套的寄存器备份是这样进行的,进入一级中断便进行一次全套寄存器的压栈 *** 作,压栈是把寄存器里面的值保存到栈区(属于内存区域,而并非你说的后背状态寄存器SPSR,其实后背状态寄存器SPSR也要一起压入栈区),每压入一个寄存器,SP会移动相应的距离,不会重叠;每退出一级中断便进行一次全套寄存器的出栈 *** 作,这样就实现了保护现场和恢复现场。可以通过编译器反汇编码窗口查看中断压栈、出栈的实现。
关于优先级是有两种的,叫默认优先级和嵌套优先级,假如A,B两个中断,如果A比B嵌套优先级(通过优先级寄存器设置)更高,就不需要看默认优先级了,A、B同时发生中断时A中断先执行而B后执行,而且B中断执行之间A可以抢断(嵌套)B的中断服务程序,B不可以抢断A;而如果嵌套优先级一样的话,只是A默认优先级比B更高(不需要设置 ),只能支持A、B同时中断时A先执行,而A不能嵌套B了,有的CPU甚至硬件上不支持嵌套,需要模拟嵌套,这个跟CPU平台有关。
奇效ADS 美国国防部目前成功研制出新一代微波武器――美军将该武器命名为微波群体控制系统,又称“主动拒止系统”(Active Denial System,缩写为“ADS”)。
“主动拒止系统”是指作用距离比野战非致命武器远很多的反人员非致命武器,它可对付轻武器作用距离之外的有生目标。
目前多数反人员非致命武器都是采用动能(如橡胶d,豆包d等)来实现,而基于动能的系统都具有一定的致命风险,并且其作用效果也会随着目标的不同而不同。但ADS系统的不同之处在于,其作用距离比其他非致命武器远10倍以上,更重要的是该系统在对付15m和500m处的目标时,其安全性和作用效果也是一样的。据介绍,当被ADS击中时,会使人产生剧烈的高温烧灼感,就好像突然面对一台开启了的烤箱。
ADS系统发射的是一束射频为95GHz的聚焦毫米波,该毫米波束可穿透人的皮肤,穿透深度约为04mm(约3张纸的厚度),并对目标的皮肤表层进行加热,在数秒钟内即可使皮肤表层的温度迅速升高到54℃,使人瞬间感受到强烈的灼烧感,从而本能地躲避射线。ADS系统不需要对其所处的环境条件(如风)因素进行修正,其硬件系统能使 *** 作员看见波束路径和目标区域,并且ADS系统中集成的计算机硬件和软件子系统可以限制发射持续时间,控制波束能量,达到非致命的效果。其扳机也是万无一失的, *** 作员一旦松开扳机,发射就会立刻中断。
系统从0到2
自1980年代末以来,美国空军一直在进行ADS系统的作用功效和可行性技术研究。现有的固定在地面使用的装备是美国“联合非致命武器项目办”在1997年提供资金开始研制的,被称为“系统0”。2002年,美国军方正式指定ADS系统进入先进概念技术演示(ACTD)阶段。先进概念技术演示(ACTD)是美国国防部为了快速把成熟的技术输送到作战人员手中而进行的正规军事评估程序。
在ACTD阶段,设计人员把ADS系统安装到高机动多用途轮式车(HMMWV)上,将整个系统命名为“系统1”。同时还对“系统1”进行了一系列的使用评估,如2005年8月在内华达州Creech空军基地、2005年9月在乔治亚州Fort Benning陆军基地、2006年4月在佛罗里达州Eglin空军基地等都对“系统1”进行了效果评估。这些效用评估采用多种模拟作战场景对武器系统进行检测,在检测过程中来自军队的志愿者们大约经历了3500多次来自ADS系统的照射。
在ACTD阶段,科研人员还研制开发了一款更军事化的ADS系统,被命名为“系统2”。“系统2”是集装箱化系统,采用战车来运输。
经过十几年的研制,到目前为止,美国在ADS系统的研究过程中,一共设计了上述3种结构形式,即“系统0”、“系统1”以及“系统2”。
“系统0”属野外固定型,于2000年12月完成,放置在美国新墨西哥州Kirtland空军基地。“系统0”配有发电机,可为整个系统提供能源。
“系统1”属机动型,于2004年交付,其主要部件与“系统0”是相同的,如发射器和天线,但这些主要部件都被集成到配有发电机的高机动多用途轮式车(HMMWV)上,只有当HMMWV停下来时,该武器系统才能使用。 *** 作员坐在车内 *** 控全系统,像增强型摄像机和红外摄像机捕获的目标图像显示在 *** 作员前方的显示屏上。 *** 作员可使用车载或手持式激光测距机来测量目标距离。 *** 作员通过 *** 纵杆 *** 控天线,把天线对准目标,然后按压扳机,目标就会被击中, *** 作员还可控制击中目标的能量和持续时间,可选择的能量级别有4级,从25%到100%;可选择的时间间隔有6档,分�为1、2、3、4、5和6秒。
“系统2”的主要部件基本上与“系统1”是相同的,但有些地方进行了改进,比如“系统2”可在较高的环境温度下工作;对 *** 作系统软件进行了改进,其安全性能更高,并可提供烟雾防护。“系统2”属集装箱式系统,其有一个封闭的、模块化的 *** 作站,并具有防护盔甲。由于附加了额外的重量和冷却系统,因此“系统2”的体积比“系统1”的要大,重量也比“系统1”的重。“系统2”可由某些军用车辆来托运,例如重型加长机动战术卡车(Heavy Expanded Mobility TacticalTruck,HEMTT)等。
试验安全性
ADS系统的大部分投资都用在了探索其对人员的效用研究方面,即为了更好地了解微波的作用以及确保它对人员的安全性。2001年开始在实验室对人体进行试验,试验程序严格遵循政府制定的用于指导动物和人类研究的程序以及法律和联邦 规章制度 ,所有的试验包括试验方案以及试验结果都经过来自认证的院校和医学专家组成的专家组进行审查和评估。
对皮肤的作用研究显示:ADS系统的能量可穿透深度为04mm(约为3张纸的厚度),能量波束可加热表层皮肤,并引起皮肤的瞬时灼烧感,目标会本能地躲避波束。
对眼睛的作用研究结果:1/4秒之后就会发生瞬目反射,ADS波束不能穿透眼睑,眯起眼睛、转过头以及反感响应都可以保护眼睛。
其他研究结果显示:ADS系统照射并不影响生殖器官,也不会导致、促进或附带加重皮肤癌。
迄今为止,该系统已进行过大量的试验,大约有600多名志愿者参与了这些试验,照射的次数也多达1万次,结果表明:当受到ADS系统攻击后,被攻击人员都会拼命逃离攻击区域,所有参试人员都无法在攻击区域内坚持5秒钟。一旦离开微波射线作用范围,疼痛感便会消失,不会造成永久性伤害。到目前为止,几乎还没有人受到需要进行医治的伤害,且轻微受伤所占的比例也不到千分之一。
装备计划
2004年,美军曾经考虑于2005年装备ADS系统,但是由于其需要经过多方面的测试,ADS系统的服役被迫推迟了两年多的时间,这也促使美国有时间研发出第二代“主动拒止系统”。尽管其服役时间一再延期,但是目前美军并没有放弃装备ADS系统的打算。如能得到五角大楼批准,该系统可于今年装备美军部队。
ADS系统可协助部队保护其基地周界、检查站以及入口控制地点;有助于进行维和与人道主义援助,可用于驱散人群,也可保护重要敏感目标,特�是诸如港口、核电站和公共建筑等那些容易遭受自杀性袭击的目标等。
尽管一部ADS系统的费用为400万美元,但是对于容易遭受的海军军港等单位来说,由于ADS的特殊作用,未来都将会安装该系统。
编辑 孙 丽
ADS工程模板的作用:
通常在ADS下用UCOS-II *** 作系统编写UART串口、网卡、flash的驱动程序,用JTAG配合ADS下载程序到开发板的内存。
现在网卡、flash都可以用了,内存里面的程序必须实现两个功能:用串口实现和用户通讯,可以用串口接收数据(bootloader),并将数据写入flash中,以便以后启动。
关掉ADS了,先设置硬件电路,实现flash启动,接着复位。
ADS是一款高级软件设计系统-ADS是领先的电子设计自动化软件,适用于射频、微波和信号完整性应用。ADS是获得商业成功的创新技术(例如X参数和3D电磁仿真器)的代表,这些技术已被无线通信与网络以及航空航天与国防领域中的领先厂商广泛采用。对于WiMAX64、LTE、多千兆位/秒数据链路、雷达和卫星应用,ADS能够借助集成平台中的无线库以及电路系统和电磁协同仿真功能提供基于标准的全面设计和验证。
ADS的主要优势
快速、精确、简单易用的全套集成系统、电路和电磁仿真器,能够一次性成功完成桌面流程设计。
特定应用设计指南将长期积累的专业知识应用于简单易用的界面中。
领先的行业和代工合作伙伴可专门或比其他产品优先数个月为ADS提供支持。
ADS帮助您把更多的精力放在设计上-而不是学习怎样使用软件上。
数据显示一目了然
如果不能从仿真结果中一目了然地了解设计的执行情况,您的生产效率将大大降低。ADS中强大的数据分析和
显示技术可以通过多种方式查看结果。后期处理能力则可以使用自定义表达式管理数据,查看不同图形上的数据或改变指标,而无需重新仿真。您甚至能够移动标尺,实时查看其它图形更新情况。每个数据显示都与仿真设置相关,可以保存和重用。
设计程序库,无线设计更加简便
对尖端无线设计,ADS设计库可以帮助您更快地推出新兴无线产品。通过在ADS中置入最新的信号格式,您可以把时间放在新设计的构想上,而不必去研究标准。设计程序库包括预先配置的电路图、数据显示和测试台,可以帮助您根据无线标准规范定义的测量项目验证设计。通过在每个开发阶段测试和验证设计,可以大大加快设计进程。
ADS中DesignGuide和模板可以简便地显示仿真结果
以上就是关于ADS1.2的工程移植到KEIL可以直接用KEIL的启动代码不不能的话可以给我详细一点的资料不全部的内容,包括:ADS1.2的工程移植到KEIL可以直接用KEIL的启动代码不不能的话可以给我详细一点的资料不、嵌入式高手进 考试题解答、ARM中断嵌套是怎么保护现场的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)