|
AVR新手移植Small RTOS 1.12到ATmega16欢迎测试,期待高手指点。
根据AVR实际情况,改动原版Small RTOS51的地方:
1. 任务切换保存全部32个寄存器,SREG,Os_Enter_Sum和返回地址(共36字节),不区分任务快速切换和一般任务切换,OSCtxSw()和OSIntCtxSw()为同一函数。
#define OSIntCtxSw() OSCtxSw() //在OS_CPU.h。
2. 空闲任务OSIdle()也有自己一份堆栈。
3. 不是将所有剩余SRAM空间分配给系统堆栈,系统堆栈空间大小由自己设定
#define OS_STACK_SIZE 512 //在OS_CPU.h,系统堆栈空间大小(包括空闲任务OSIdle的堆栈)
4. OS_CPU_A.s新加了一个头文件,Os_cpu_a.h。本想把这个头文件放到OS_CPU.H里的,但不知道GCC标记C程序生成的宏是什么(在KEIL C里面,标记C程序的宏是 #define __C51__)。
附:任务切换函数OSCtxSw()汇编代码:
#define OS_CPU_A
#include "Os_cpu_a.h"
.text
.section .text
OSCtxSw:
PUSHALL
lds r24,Os_Enter_Sum
push r24
in r24, SREG
push r24
; SaveSP=SP;
in r6, SPL
in r7, SPH
#if EN_SP2>0
.extern Sp2
in r0,SREG
cli
out SPH,hi8(Sp2+Sp2Space-1)
out SREG,r0
out SPL,lo8(Sp2+Sp2Space-1)
#endif
;cp1=SaveSP;
movw r8, r6
; temp_p= (uint16)OSTaskStackBottom[OSNextTaskID+1];
lds r24, OSNextTaskID
mov r18, r24
eor r19, r19
movw r24, r18
add r24, r18
adc r25, r19
movw r30, r24
subi r30, lo8(-(OSTaskStackBottom+2))
sbci r31, hi8(-(OSTaskStackBottom+2))
ld r12, Z
ldd r13, Z+1
;cp2=(uint16)(OSTaskStackBottom[OSTaskID+1]);
lds r24, OSTaskID
mov r18, r24
eor r19, r19
movw r24, r18
add r24, r18
adc r25, r19
movw r30, r24
subi r30, lo8(-(OSTaskStackBottom+2))
sbci r31, hi8(-(OSTaskStackBottom+2))
ld r10, Z
ldd r11, Z+1
;if(OSTaskID<OSNextTaskID)
lds r24, OSTaskID
lds r25, OSNextTaskID
cp r24, r25
brcs .+2
rjmp OSCtxSw_5
;{while(cp2!=temp_p)
OSCtxSw_1:
cp r10, r12
cpc r11, r13
breq OSCtxSw_2
;{*(uint8 *)cp1=*(uint8 *)cp2;
movw r30, r8
movw r26, r10
ld r24, X
st Z, r24
; cp1--;cp2--;}
sec
sbc r8, r1
sbc r9, r1
sec
sbc r10, r1
sbc r11, r1
rjmp OSCtxSw_1
; SP=cp1;
OSCtxSw_2:
in R0,SREG
cli
out SPH, r9
out SREG,R0
out SPL, r8
; temp16=cp1-cp2;
movw r4, r8
sub r4, r10
sbc r5, r11
; for(i8=OSTaskID+1;i8<OSNextTaskID+1;i8++)
lds r24,OSTaskID
mov r2, r24
inc r2
OSCtxSw_3:
mov r18, r2
eor r19, r19
lds r24, OSNextTaskID
eor r25, r25
adiw r24, 0x01
cp r18, r24
cpc r19, r25
brge OSCtxSw_4
; { OSTaskStackBottom[i8]+=temp16; }
mov r18, r2
eor r19, r19
movw r24, r18
add r24, r18
adc r25, r19
movw r26, r24
subi r26, lo8(-(OSTaskStackBottom))
sbci r27, hi8(-(OSTaskStackBottom))
movw r30,r26
ld r24, Z
ldd r25, Z+1
add r24, r4
adc r25, r5
adiw r26, 0x01
st X, r25
st -X, r24
inc r2
rjmp OSCtxSw_3
; OSTaskID=OSNextTaskID;
OSCtxSw_4:
lds r24, OSNextTaskID
sts OSTaskID, r24
; goto loadctx;
Rjmp OSCtxSw_11
; else if(OSNextTaskID<OSTaskID)
OSCtxSw_5:
lds r25, OSNextTaskID
lds r24, OSTaskID
cp r25, r24
brcs .+2
rjmp OSCtxSw_10
;{ while(cp1!=temp_p)
OSCtxSw_6:
cp r8, r12
cpc r9, r13
breq OSCtxSw_7
;{ *(uint8 *)(++cp2)=*(uint8 *)(++cp1);}
sec
adc r10, r1
adc r11, r1
movw r30, r10
sec
adc r8, r1
adc r9, r1
movw r26, r8
ld r24, X
st Z, r24
rjmp OSCtxSw_6
;SP=cp1;
OSCtxSw_7:
in R0,SREG
cli
out SPH, r9
out SREG,R0
out SPL, r8
; temp16=cp1-cp2;
movw r4, r8
sub r4, r10
sbc r5, r11
;for(i8=OSNextTaskID+1;i8<OSTaskID+1;i8++)
lds r24, OSNextTaskID
mov r2, r24
inc r2
OSCtxSw_8:
mov r18, r2
eor r19, r19
lds r24,OSTaskID
eor r25, r25
adiw r24, 0x01
cp r18,r24
cpc r19,r25
brge OSCtxSw_9
; { OSTaskStackBottom[i8]-=temp16;}
mov r18, r2
eor r19, r19
movw r24, r18
add r24, r18
adc r25, r19
movw r26, r24
subi r26, lo8(-(OSTaskStackBottom))
sbci r27, hi8(-(OSTaskStackBottom))
movw r30,r26
ld r24, Z
ldd r25, Z+1
sub r24, r4
sbc r25, r5
adiw r26, 0x01
st X, r25
st -X, r24
inc r2
rjmp OSCtxSw_8
; OSTaskID=OSNextTaskID;
OSCtxSw_9:
lds r24, OSNextTaskID
sts OSTaskID, r24
; goto loadctx;
rjmp OSCtxSw_11
OSCtxSw_10:
; else SP=SaveSP;
in r0,SREG
cli
out SPH, r7
sts 0x5f,r0
sts 0x005D, r6
; goto loadctx;
OSCtxSw_11:
;loadctx:
pop r0 ;SREG暂存
cli
pop r24 ;Os_Enter_Sum
sts Os_Enter_Sum,r24
and r24,r24
brne OSCtxSw_12
OS_SET_INT
OSCtxSw_12:
out SREG,r0
POPALL
ret
点击此处下载armok01152918.rar
-----此内容被ATmega8515于2007-05-05,16:19:49编辑过 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|