Please see my note book http://mbed.org/users/kenjiArai/notebook/freertos-on-mbed-board-with-mbed-cloud-ide--never-/
This is too old.
Below is another FreeRTOS on mbed.
http://developer.mbed.org/users/rgrover1/code/FreeRTOS/
I don't know it works well or not.
I have not evaluated it.
FreeRTOS/Source/portable/GCC/ARM_CM3/port_asm_mbed.s
- Committer:
- kenjiArai
- Date:
- 2011-01-01
- Revision:
- 0:d4960fcea8ff
File content as of revision 0:d4960fcea8ff:
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; ; This is a program for FreeRTOS on LPC1768 mbed IDE ; ; C source file: port_asm.c ; Compiled on: GCC: (Sourcery G++ Lite 2010q1-188) 4.4.1 ; Hand modification by: Kenji Arai / JH1PJL ; http://www.page.sannet.ne.jp/kenjia/index.html ; ; Started on: October 31st, 2010 ; updated on: October 31st, 2010 ; ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; .syntax unified ; .cpu cortex-m3 ; .fpu softvfp ; .eabi_attribute 20, 1 ; .eabi_attribute 21, 1 ; .eabi_attribute 23, 3 ; .eabi_attribute 24, 1 ; .eabi_attribute 25, 1 ; .eabi_attribute 26, 1 ; .eabi_attribute 30, 6 ; .eabi_attribute 18, 4 EXTERN pxCurrentTCB EXTERN uxCriticalNesting EXTERN vTaskSwitchContext EXTERN vTaskIncrementTick EXTERN prvCopyDataToQueue EXTERN xTaskRemoveFromEventList EXTERN prvCopyDataFromQueue EXTERN prvIdleTask EXTERN xTaskGenericCreate EXTERN xSchedulerRunning EXTERN xTickCount EXTERN vConfigureTimerForRunTimeStats EXTERN xPortStartScheduler EXTERN vPortEndScheduler CODE16 PRESERVE8 AREA Port, CODE, READONLY ;////////////////////////////////////////////////////// ; .thumb THUMB ; .file "port_asm.c" ; .text ; .align 2 ALIGN 2 GLOBAL Reset_Handler THUMB Reset_Handler push {r7, lr} pop {r7, pc} ;/////////////////////////////////////////////////////// ALIGN 2 ; .global vPortSVCHandler GLOBAL vPortSVCHandler ; .thumb THUMB ; .thumb_func ; .type vPortSVCHandler, %function ;vPortSVCHandler: vPortSVCHandler ; @ Naked Function: prologue and epilogue provided by programmer. ; @ args = 0, pretend = 0, frame = 0 ; @ frame_needed = 1, uses_anonymous_args = 0 ;@ 199 "port_asm.c" 1 ldr r3, pxCurrentTCBConst2 ldr r1, [r3] ldr r0, [r1] ldmia r0!, {r4-r11} msr psp, r0 mov r0, #0 msr basepri, r0 orr r14, #0xd bx r14 ; .align 2 ALIGN 2 ;pxCurrentTCBConst2: .word pxCurrentTCB pxCurrentTCBConst2 DCD pxCurrentTCB ;@ 0 "" 2 ; .thumb THUMB ; .size vPortSVCHandler, .-vPortSVCHandler ;/////////////////////////////////////////////////////// ; .align 2 ALIGN 2 ; .global vPortStartFirstTask GLOBAL vPortStartFirstTask ; .thumb THUMB ; .thumb_func ; .type vPortStartFirstTask, %function ;vPortStartFirstTask: vPortStartFirstTask ; @ Naked Function: prologue and epilogue provided by programmer. ; @ args = 0, pretend = 0, frame = 0 ; @ frame_needed = 1, uses_anonymous_args = 0 ;@ 218 "port_asm.c" 1 ldr r0, =0xE000ED08 ldr r0, [r0] ldr r0, [r0] msr msp, r0 svc 0 ;@ 0 "" 2 ; .thumb THUMB ; .size vPortStartFirstTask, .-vPortStartFirstTask ;/////////////////////////////////////////////////////// ; .align 2 ALIGN 2 ; .global vPortEnterCritical GLOBAL vPortEnterCritical ; .thumb THUMB ; .thumb_func ; .type vPortEnterCritical, %function ;vPortEnterCritical: vPortEnterCritical ; @ args = 0, pretend = 0, frame = 0 ; @ frame_needed = 1, uses_anonymous_args = 0 ; @ link register save eliminated. push {r7} add r7, sp, #0 ;@ 270 "port_asm.c" 1 mov r0, #40 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB movw r3, #:lower16:uxCriticalNesting movt r3, #:upper16:uxCriticalNesting ldr r3, [r3, #0] add r2, r3, #1 movw r3, #:lower16:uxCriticalNesting movt r3, #:upper16:uxCriticalNesting str r2, [r3, #0] mov sp, r7 pop {r7} bx lr ; .size vPortEnterCritical, .-vPortEnterCritical ;/////////////////////////////////////////////////////// ; .align 2 ALIGN 2 ; .global vPortExitCritical GLOBAL vPortExitCritical ; .thumb THUMB ; .thumb_func ; .type vPortExitCritical, %function ;vPortExitCritical: vPortExitCritical ; @ args = 0, pretend = 0, frame = 0 ; @ frame_needed = 1, uses_anonymous_args = 0 ; @ link register save eliminated. push {r7} add r7, sp, #0 movw r3, #:lower16:uxCriticalNesting movt r3, #:upper16:uxCriticalNesting ldr r3, [r3, #0] add r2, r3, #-1 movw r3, #:lower16:uxCriticalNesting movt r3, #:upper16:uxCriticalNesting str r2, [r3, #0] movw r3, #:lower16:uxCriticalNesting movt r3, #:upper16:uxCriticalNesting ldr r3, [r3, #0] cmp r3, #0 ; bne .L9 bne Jmp0 ;@ 280 "port_asm.c" 1 mov r0, #0 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB ;.L9: Jmp0 mov sp, r7 pop {r7} bx lr ; .size vPortExitCritical, .-vPortExitCritical ;/////////////////////////////////////////////////////// ; .align 2 ALIGN 2 ; .global xPortPendSVHandler GLOBAL xPortPendSVHandler ; .thumb THUMB ; .thumb_func ; .type xPortPendSVHandler, %function ;xPortPendSVHandler: xPortPendSVHandler ; @ Naked Function: prologue and epilogue provided by programmer. ; @ args = 0, pretend = 0, frame = 0 ; @ frame_needed = 1, uses_anonymous_args = 0 ;@ 289 "port_asm.c" 1 mrs r0, psp ldr r3, pxCurrentTCBConst ldr r2, [r3] stmdb r0!, {r4-r11} str r0, [r2] stmdb sp!, {r3, r14} mov r0, #40 msr basepri, r0 ; error " port_asm_mbed.s.s.LPC1768.o(Port) contains invalid call from '~PRES8 (The user did not require code to preserve 8-byte aligment of 8-byte data objects)' function to 'REQ8 (Code was permitted to depend on the 8-byte aligment of 8-byte data items)' function vTaskSwitchContext. (EL6238E) bl vTaskSwitchContext mov r0, #0 msr basepri, r0 ldmia sp!, {r3, r14} ldr r1, [r3] ldr r0, [r1] ldmia r0!, {r4-r11} msr psp, r0 bx r14 ; .align 2 ALIGN 2 ;pxCurrentTCBConst: .word pxCurrentTCB pxCurrentTCBConst DCD pxCurrentTCB ;@ 0 "" 2 ; .thumb THUMB ; .size xPortPendSVHandler, .-xPortPendSVHandler ;/////////////////////////////////////////////////////// ; .align 2 ALIGN 2 ; .global xPortSysTickHandler GLOBAL xPortSysTickHandler ; .thumb THUMB ; .thumb_func ; .type xPortSysTickHandler, %function ;xPortSysTickHandler: xPortSysTickHandler ; @ args = 0, pretend = 0, frame = 8 ; @ frame_needed = 1, uses_anonymous_args = 0 push {r7, lr} sub sp, sp, #8 add r7, sp, #0 ; movw r3, #:lower16:-536810236 ; movt r3, #:upper16:-536810236 movw r3, #0xED04 movt r3, #0xE000 ; movw r3, #:LDW:(-536810236) ; movt r3, #:HDW:(-536810236) ; mov32 r3, -536810236 ; mov r2, #268435456 str r2, [r3, #0] mov r3, #0 str r3, [r7, #4] ;@ 329 "port_asm.c" 1 mov r0, #40 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB bl vTaskIncrementTick ;@ 333 "port_asm.c" 1 mov r0, #0 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB add r7, r7, #8 mov sp, r7 pop {r7, pc} ; .size xPortSysTickHandler, .-xPortSysTickHandler ;/////////////////////////////////////////////////////// ; .align 2 ALIGN 2 ; .global xQueueGenericSendFromISR GLOBAL xQueueGenericSendFromISR ; .thumb THUMB ; .thumb_func ; .type xQueueGenericSendFromISR, %function ;xQueueGenericSendFromISR: xQueueGenericSendFromISR ; @ args = 0, pretend = 0, frame = 24 ; @ frame_needed = 1, uses_anonymous_args = 0 push {r7, lr} sub sp, sp, #24 add r7, sp, #0 str r0, [r7, #12] str r1, [r7, #8] str r2, [r7, #4] str r3, [r7, #0] mov r3, #0 str r3, [r7, #20] ;@ 399 "port_asm.c" 1 mov r0, #40 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB ldr r3, [r7, #12] ldr r2, [r3, #56] ldr r3, [r7, #12] ldr r3, [r3, #60] cmp r2, r3 ; bcs .L15 bcs Jmp5 ldr r0, [r7, #12] ldr r1, [r7, #8] ldr r2, [r7, #0] bl prvCopyDataToQueue ldr r3, [r7, #12] ldr r3, [r3, #72] cmp r3, #-1 ; bne .L16 bne Jmp1 ldr r3, [r7, #12] ldr r3, [r3, #36] cmp r3, #0 ; beq .L21 beq Jmp2 ldr r3, [r7, #12] add r3, r3, #36 mov r0, r3 bl xTaskRemoveFromEventList mov r3, r0 cmp r3, #0 ; beq .L22 beq Jmp3 ldr r3, [r7, #4] mov r2, #1 str r2, [r3, #0] ; b .L18 b Jmp4 ;.L16: Jmp1 ldr r3, [r7, #12] ldr r3, [r3, #72] add r2, r3, #1 ldr r3, [r7, #12] str r2, [r3, #72] ; b .L18 b Jmp4 ;.L21: Jmp2 nop ; b .L18 b Jmp4 ;.L22: Jmp3 nop ;.L18: Jmp4 mov r3, #1 str r3, [r7, #16] ; b .L19 b Jmp6 ;.L15: Jmp5 mov r3, #0 str r3, [r7, #16] ;.L19: Jmp6 ;@ 436 "port_asm.c" 1 mov r0, #0 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB ldr r3, [r7, #16] mov r0, r3 add r7, r7, #24 mov sp, r7 pop {r7, pc} ; .size xQueueGenericSendFromISR, .-xQueueGenericSendFromISR ;/////////////////////////////////////////////////////// ; .align 2 ALIGN 2 ; .global xQueueReceiveFromISR GLOBAL xQueueReceiveFromISR ; .thumb THUMB ; .thumb_func ; .type xQueueReceiveFromISR, %function ;xQueueReceiveFromISR: xQueueReceiveFromISR ; @ args = 0, pretend = 0, frame = 24 ; @ frame_needed = 1, uses_anonymous_args = 0 push {r7, lr} sub sp, sp, #24 add r7, sp, #0 str r0, [r7, #12] str r1, [r7, #8] str r2, [r7, #4] mov r3, #0 str r3, [r7, #20] ;@ 449 "port_asm.c" 1 mov r0, #40 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB ldr r3, [r7, #12] ldr r3, [r3, #56] cmp r3, #0 ; beq .L24 beq Jmp11 ldr r0, [r7, #12] ldr r1, [r7, #8] bl prvCopyDataFromQueue ldr r3, [r7, #12] ldr r3, [r3, #56] add r2, r3, #-1 ldr r3, [r7, #12] str r2, [r3, #56] ldr r3, [r7, #12] ldr r3, [r3, #68] cmp r3, #-1 ; bne .L25 bne Jmp7 ldr r3, [r7, #12] ldr r3, [r3, #16] cmp r3, #0 ; beq .L30 beq Jmp8 ldr r3, [r7, #12] add r3, r3, #16 mov r0, r3 bl xTaskRemoveFromEventList mov r3, r0 cmp r3, #0 ; beq .L31 beq Jmp9 ldr r3, [r7, #4] mov r2, #1 str r2, [r3, #0] ; b .L27 b Jmp10 ;.L25: Jmp7 ldr r3, [r7, #12] ldr r3, [r3, #68] add r2, r3, #1 ldr r3, [r7, #12] str r2, [r3, #68] ; b .L27 b Jmp10 ;.L30: Jmp8 nop ; b .L27 b Jmp10 ;.L31: Jmp9 nop ;.L27: Jmp10 mov r3, #1 str r3, [r7, #16] ; b .L28 b Jmp12 ;.L24: Jmp11 mov r3, #0 str r3, [r7, #16] ;.L28: Jmp12 ;@ 489 "port_asm.c" 1 mov r0, #0 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB ldr r3, [r7, #16] mov r0, r3 add r7, r7, #24 mov sp, r7 pop {r7, pc} ; .size xQueueReceiveFromISR, .-xQueueReceiveFromISR ;/////////////////////////////////////////////////////// ; .section .rodata ; AREA Text, CODE, READONLY ?????????????????????????????????????????????? ; .align 2 ALIGN 2 ;.LC0: Txt0 ; .ascii "IDLE\000" DCB "IDLE\000",0 ; .text ; AREA Port, CODE, READONLY ?????????????????????????????????????????????? ;/////////////////////////////////////////////////////// ; .align 2 ALIGN 2 ; .global vTaskStartScheduler GLOBAL vTaskStartScheduler ; .thumb THUMB ; .thumb_func ; .type vTaskStartScheduler, %function ;vTaskStartScheduler: vTaskStartScheduler ; @ args = 0, pretend = 0, frame = 8 ; @ frame_needed = 1, uses_anonymous_args = 0 push {r7, lr} sub sp, sp, #24 add r7, sp, #16 ; movw r3, #:lower16:.LC0 ; movt r3, #:upper16:.LC0 ; movw r3, # LDW Txt0 ; movt r3, # HDW Txt0 movw r3, #:lower16:Txt0 movt r3, #:upper16:Txt0 mov r2, #0 str r2, [sp, #0] mov r2, #0 str r2, [sp, #4] mov r2, #0 str r2, [sp, #8] mov r2, #0 str r2, [sp, #12] movw r0, #:lower16:prvIdleTask movt r0, #:upper16:prvIdleTask mov r1, r3 mov r2, #64 mov r3, #0 bl xTaskGenericCreate mov r3, r0 str r3, [r7, #4] ldr r3, [r7, #4] cmp r3, #1 ; bne .L34 bne Jmp13 ;@ 514 "port_asm.c" 1 mov r0, #40 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB movw r3, #:lower16:xSchedulerRunning movt r3, #:upper16:xSchedulerRunning mov r2, #1 str r2, [r3, #0] movw r3, #:lower16:xTickCount movt r3, #:upper16:xTickCount mov r2, #0 str r2, [r3, #0] bl vConfigureTimerForRunTimeStats bl xPortStartScheduler ;.L34: Jmp13 add r7, r7, #8 mov sp, r7 pop {r7, pc} ; .size vTaskStartScheduler, .-vTaskStartScheduler ;/////////////////////////////////////////////////////// ; .align 2 ALIGN 2 ; .global vTaskEndScheduler GLOBAL vTaskEndScheduler ; .thumb THUMB ; .thumb_func ; .type vTaskEndScheduler, %function ;vTaskEndScheduler: vTaskEndScheduler ; @ args = 0, pretend = 0, frame = 0 ; @ frame_needed = 1, uses_anonymous_args = 0 push {r7, lr} add r7, sp, #0 ;@ 546 "port_asm.c" 1 mov r0, #40 msr basepri, r0 ;@ 0 "" 2 ; .thumb THUMB movw r3, #:lower16:xSchedulerRunning movt r3, #:upper16:xSchedulerRunning mov r2, #0 str r2, [r3, #0] bl vPortEndScheduler pop {r7, pc} ; .size vTaskEndScheduler, .-vTaskEndScheduler ; .ident "GCC: (Sourcery G++ Lite 2010q1-188) 4.4.1" ALIGN 2 nop nop nop END