More work in progress on NEC port and demo.

This commit is contained in:
Richard Barry 2009-01-26 17:29:01 +00:00
parent d811a00690
commit cadd182942
3 changed files with 235 additions and 29 deletions

View file

@ -29,17 +29,17 @@
; ***************************************************************************
;
;------------------------------------------------------------------------------
; Note: Select the correct include files for the device used by the application.
; Note: Select the correct include files for the device used by the application.
#include "FreeRTOSConfig.h"
;------------------------------------------------------------------------------
; Functions used by scheduler
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
EXTERN vTaskSwitchContext
EXTERN vTaskIncrementTick
; Variables used by scheduler
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
EXTERN pxCurrentTCB
EXTERN usCriticalNesting
@ -49,7 +49,7 @@
PUBLIC vPortStart
; Security ID definition
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
#define CG_SECURITY0 0FFH
#define CG_SECURITY1 0FFH
#define CG_SECURITY2 0FFH
@ -84,7 +84,7 @@ MD_INTTM0EQ0 SYMBOL "MD_INTTM0EQ0"
; and the usCriticalNesting Value of the active Task onto the task stack
; saves stack pointer to the TCB
;------------------------------------------------------------------------------
portSAVE_CONTEXT MACRO
portSAVE_CONTEXT MACRO
#if configDATA_MODE == 1 ; Using the Tiny data model
prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers
sst.w r19,72[ep]
@ -123,7 +123,7 @@ portSAVE_CONTEXT MACRO
#endif /* configDATA_MODE */
sst.w r2,8[ep]
sst.w r1,4[ep]
MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack
MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack
ld.w lw1(usCriticalNesting)[r1],r2
sst.w r2,0[ep]
MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB
@ -136,7 +136,7 @@ portSAVE_CONTEXT MACRO
; portRESTORE_CONTEXT MACRO
; Gets stack pointer from the current TCB
; Restores the context of the usCriticalNesting value and general purpose
; registers of the selected task from the task stack
; registers of the selected task from the task stack
;------------------------------------------------------------------------------
portRESTORE_CONTEXT MACRO
MOVHI hi1(pxCurrentTCB),r0,r1 ; get Stackpointer address
@ -148,7 +148,7 @@ portRESTORE_CONTEXT MACRO
MOVHI hi1(usCriticalNesting),r0,r2
st.w r1,lw1(usCriticalNesting)[r2]
sld.w 4[ep],r1 ; restore general purpose registers
sld.w 8[ep],r2
sld.w 8[ep],r2
#if configDATA_MODE == 1 ; Using Tiny data model
sld.w 12[ep],r4
sld.w 16[ep],r5
@ -184,7 +184,7 @@ portRESTORE_CONTEXT MACRO
sld.w 64[ep],r18
sld.w 68[ep],r19
dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}
#endif /* configDATA_MODE */
#endif /* configDATA_MODE */
ENDM
;------------------------------------------------------------------------------
@ -200,7 +200,7 @@ portRESTORE_CONTEXT MACRO
RSEG CODE:CODE
vPortStart:
portRESTORE_CONTEXT ; Restore the context of whichever task the ...
ld.w 0[sp],lp
ld.w 0[sp],lp
ldsr lp,5 ; restore PSW
DI
ld.w 4[sp],lp ; restore LP
@ -208,10 +208,10 @@ vPortStart:
ADD 0x0C,sp ; set SP to right position
EI
jmp [lp]
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Port Yield function to check for a Task switch in the cooperative and
; Port Yield function to check for a Task switch in the cooperative and
; preemptive mode
;
; Input: NONE
@ -220,6 +220,9 @@ vPortStart:
;
; Output: NONE
;------------------------------------------------------------------------------
#if 0
RSEG CODE:CODE
vPortYield:
DI
@ -236,24 +239,50 @@ vPortYield:
ld.w 4[sp],lp ; restore PIPC
ldsr lp,0
ld.w 8[sp],lp ; restore LP
add 0x0C,sp
add 0x0C,sp
RETI
#else
RSEG CODE:CODE
vPortYield:
add -0x0C,sp ; prepare stack to save necessary values
st.w lp,8[sp] ; store LP to stack
stsr 0,r31
st.w lp,4[sp] ; store EIPC to stack
stsr 1,lp
st.w lp,0[sp] ; store EIPSW to stack
portSAVE_CONTEXT ; Save the context of the current task.
jarl vTaskSwitchContext,lp ; Call the scheduler.
portRESTORE_CONTEXT ; Restore the context of whichever task the ...
; ... scheduler decided should run.
ld.w 0[sp],lp ; restore EIPSW from stack
ldsr lp,1
ld.w 4[sp],lp ; restore EIPC from stack
ldsr lp,0
ld.w 8[sp],lp ; restore LP from stack
add 0x0C,sp ; set SP to right position
RETI
#endif
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Perform the necessary steps of the Tick Count Increment and Task Switch
; depending on the chosen kernel configuration
; depending on the chosen kernel configuration
;
; Input: NONE
;
; Call: ISR
; Call: ISR
;
; Output: NONE
;------------------------------------------------------------------------------
#if configUSE_PREEMPTION == 1 ; use preemptive kernel mode
MD_INTTM0EQ0:
add -0x0C,sp ; prepare stack to save necessary values
st.w lp,8[sp] ; store LP to stack
stsr 0,r31
@ -272,8 +301,8 @@ MD_INTTM0EQ0:
ld.w 8[sp],lp ; restore LP from stack
add 0x0C,sp ; set SP to right position
RETI
;------------------------------------------------------------------------------
RETI
;------------------------------------------------------------------------------
#else ; use cooperative kernel mode
MD_INTTM0EQ0:
@ -284,7 +313,7 @@ MD_INTTM0EQ0:
sld.w 0[ep],r5
sld.w 4[ep],r1
dispose 8,{lp,ep}
RETI
RETI
#endif /* configUSE_PREEMPTION */
;------------------------------------------------------------------------------
@ -296,8 +325,13 @@ MD_INTTM0EQ0:
RSEG NEAR_ID:CONST:SORT:NOROOT(2)
`?<Initializer for usCriticalNesting>`:
DW 10
;------------------------------------------------------------------------------
COMMON INTVEC:CODE:ROOT(2)
ORG 40H
`??vPortYield??INTVEC 40`:
JR vPortYield
;------------------------------------------------------------------------------
; set microcontroller security ID
COMMON INTVEC:CODE:ROOT(2)
@ -314,7 +348,7 @@ MD_INTTM0EQ0:
DB CG_SECURITY8
DB CG_SECURITY9
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; set microcontroller option bytes
COMMON INTVEC:CODE:ROOT(2)
@ -326,5 +360,5 @@ MD_INTTM0EQ0:
DB OPT7D
DB OPT7E
DB OPT7F
END