|
在本站可以下载到MICRIUM官方的UCOS在AVR MCU的移植范例,此例程是针对ATMEGA128芯片的,不修改不能适合其他AVR芯片,
移植时有以下几个关键点要注意:
文件名:vector.s
.area OSTickISR(abs)
//.org 16*4 //ATMEGA128
.org 9*4 //ATMEGA16 timer0 overfolw interrupu vector
//.org 4*4 //ATMEGA16 timer2 overfolw interrupu vector
JMP _OSTickISR
此为中断向量定义文件,不同的AVR MCU中断向量可能不同,如果发现CPU启用中断就发生复位首先就是这里错了。
文件名:os_cpu_a.s
.macro PUSH_ALL ; Save all registers
ST -Y,R0
ST -Y,R1
ST -Y,R2
ST -Y,R3
ST -Y,R4
ST -Y,R5
ST -Y,R6
ST -Y,R7
ST -Y,R8
ST -Y,R9
ST -Y,R10
ST -Y,R11
ST -Y,R12
ST -Y,R13
ST -Y,R14
ST -Y,R15
ST -Y,R16
ST -Y,R17
ST -Y,R18
ST -Y,R19
ST -Y,R20
ST -Y,R21
ST -Y,R22
ST -Y,R23
ST -Y,R24
ST -Y,R25
ST -Y,R26
ST -Y,R27
ST -Y,R30
ST -Y,R31
//IN R16,RAMPZ
//ST -Y,R16
.endmacro
.macro POP_ALL ; Restore all registers
//LD R16,Y+
//OUT RAMPZ,R16
LD R31,Y+
LD R30,Y+
LD R27,Y+
LD R26,Y+
LD R25,Y+
LD R24,Y+
LD R23,Y+
LD R22,Y+
LD R21,Y+
LD R20,Y+
LD R19,Y+
LD R18,Y+
LD R17,Y+
LD R16,Y+
LD R15,Y+
LD R14,Y+
LD R13,Y+
LD R12,Y+
LD R11,Y+
LD R10,Y+
LD R9,Y+
LD R8,Y+
LD R7,Y+
LD R6,Y+
LD R5,Y+
LD R4,Y+
LD R3,Y+
LD R2,Y+
LD R1,Y+
LD R0,Y+
.endmacro
此程序段为寄存器进出栈,有些AVR MCU没有RAMPZ寄存器,如没有应该取消该寄存器的进出栈,
否则RAMPZ被指向错误的地址,会发生不可预料的错误。
文件名:os_cfg.h
//#define OS_TASK_STK_SIZE 256 /* Default size for each task stack (Total stack size) */
#define OS_TASK_STK_SIZE 128 //Default size for each task stack ATMEGA16
#define OS_TASK_HARD_STK_SIZE 32 /* Default size for the hardware stack */
此处定义了每个任务可使用的堆栈空间,不同的AVR MCU的RAM大小不同,要根据不同的RAM大小调整堆栈的大小。
以上是本人在AVR MCU上移植UCOS总结的几个关键点,不尽之处,欢迎高手跟贴。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|