Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/kernel/svc_handler.c@0:ccdea31d8eba, 2019-08-23 (annotated)
- Committer:
- gawas
- Date:
- Fri Aug 23 16:43:44 2019 +0000
- Revision:
- 0:ccdea31d8eba
init funtion;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| gawas | 0:ccdea31d8eba | 1 | #include <stm32f4xx_hal.h> |
| gawas | 0:ccdea31d8eba | 2 | #include <apex_types.h> |
| gawas | 0:ccdea31d8eba | 3 | #include <apex_queuing.h> |
| gawas | 0:ccdea31d8eba | 4 | |
| gawas | 0:ccdea31d8eba | 5 | #include "context.h" |
| gawas | 0:ccdea31d8eba | 6 | #include "drivers/time_get.h" |
| gawas | 0:ccdea31d8eba | 7 | #include "process.h" |
| gawas | 0:ccdea31d8eba | 8 | #include "part_scheduler.h" |
| gawas | 0:ccdea31d8eba | 9 | |
| gawas | 0:ccdea31d8eba | 10 | #include "ports.h" |
| gawas | 0:ccdea31d8eba | 11 | |
| gawas | 0:ccdea31d8eba | 12 | |
| gawas | 0:ccdea31d8eba | 13 | static uint32_t pop(uint32_t *p) |
| gawas | 0:ccdea31d8eba | 14 | { |
| gawas | 0:ccdea31d8eba | 15 | const uint32_t ret = *(uint32_t *)(*p); |
| gawas | 0:ccdea31d8eba | 16 | *p += 4; |
| gawas | 0:ccdea31d8eba | 17 | return ret; |
| gawas | 0:ccdea31d8eba | 18 | } |
| gawas | 0:ccdea31d8eba | 19 | |
| gawas | 0:ccdea31d8eba | 20 | |
| gawas | 0:ccdea31d8eba | 21 | void SVC_Handler(void) |
| gawas | 0:ccdea31d8eba | 22 | { |
| gawas | 0:ccdea31d8eba | 23 | ARM_HW_context_state* stack; |
| gawas | 0:ccdea31d8eba | 24 | |
| gawas | 0:ccdea31d8eba | 25 | __ASM volatile ( |
| gawas | 0:ccdea31d8eba | 26 | "TST LR, #0x4 \n\t" // Test bit 2 of EXC_RETURN |
| gawas | 0:ccdea31d8eba | 27 | "ITE EQ \n\t" // Which stack pointer was used? |
| gawas | 0:ccdea31d8eba | 28 | "MRSEQ %0, MSP \n\t" // Move MSP into pointer if EQ flag is set |
| gawas | 0:ccdea31d8eba | 29 | "MRSNE %0, PSP \n\t" // Move SSP into pointer if NE flag is set |
| gawas | 0:ccdea31d8eba | 30 | : "=r" (stack) |
| gawas | 0:ccdea31d8eba | 31 | : : |
| gawas | 0:ccdea31d8eba | 32 | ); |
| gawas | 0:ccdea31d8eba | 33 | |
| gawas | 0:ccdea31d8eba | 34 | /* Disable sysTick */ |
| gawas | 0:ccdea31d8eba | 35 | SysTick->CTRL = |
| gawas | 0:ccdea31d8eba | 36 | SysTick_CTRL_CLKSOURCE_Msk | |
| gawas | 0:ccdea31d8eba | 37 | SysTick_CTRL_ENABLE_Msk; |
| gawas | 0:ccdea31d8eba | 38 | |
| gawas | 0:ccdea31d8eba | 39 | switch (stack->R0) { |
| gawas | 0:ccdea31d8eba | 40 | case 0xc0ffee0a: |
| gawas | 0:ccdea31d8eba | 41 | { |
| gawas | 0:ccdea31d8eba | 42 | uint8_t argc = 3; |
| gawas | 0:ccdea31d8eba | 43 | uint32_t argv[argc]; |
| gawas | 0:ccdea31d8eba | 44 | |
| gawas | 0:ccdea31d8eba | 45 | while(argc--) { |
| gawas | 0:ccdea31d8eba | 46 | argv[argc] = pop(&stack->R2); |
| gawas | 0:ccdea31d8eba | 47 | } |
| gawas | 0:ccdea31d8eba | 48 | |
| gawas | 0:ccdea31d8eba | 49 | runtime_create_process( |
| gawas | 0:ccdea31d8eba | 50 | (PROCESS_ATTRIBUTE_TYPE *) argv[0], |
| gawas | 0:ccdea31d8eba | 51 | (PROCESS_ID_TYPE *) argv[1], |
| gawas | 0:ccdea31d8eba | 52 | (RETURN_CODE_TYPE *) argv[2]); |
| gawas | 0:ccdea31d8eba | 53 | break; |
| gawas | 0:ccdea31d8eba | 54 | } |
| gawas | 0:ccdea31d8eba | 55 | case 0xc0ffee0b: |
| gawas | 0:ccdea31d8eba | 56 | { |
| gawas | 0:ccdea31d8eba | 57 | uint64_t time = TIME_Get_Total(); |
| gawas | 0:ccdea31d8eba | 58 | stack->R0 = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 59 | stack->R1 = (uint32_t) time; |
| gawas | 0:ccdea31d8eba | 60 | stack->R2 = (uint32_t) (time >> 32); |
| gawas | 0:ccdea31d8eba | 61 | break; |
| gawas | 0:ccdea31d8eba | 62 | } |
| gawas | 0:ccdea31d8eba | 63 | case 0xc0ffee0c: |
| gawas | 0:ccdea31d8eba | 64 | { |
| gawas | 0:ccdea31d8eba | 65 | uint8_t argc = 7; |
| gawas | 0:ccdea31d8eba | 66 | uint32_t argv[argc]; |
| gawas | 0:ccdea31d8eba | 67 | |
| gawas | 0:ccdea31d8eba | 68 | while(argc--) { |
| gawas | 0:ccdea31d8eba | 69 | argv[argc] = pop(&stack->R2); |
| gawas | 0:ccdea31d8eba | 70 | } |
| gawas | 0:ccdea31d8eba | 71 | |
| gawas | 0:ccdea31d8eba | 72 | create_queuing_port( |
| gawas | 0:ccdea31d8eba | 73 | (char *) argv[0], |
| gawas | 0:ccdea31d8eba | 74 | (MESSAGE_SIZE_TYPE) argv[1], |
| gawas | 0:ccdea31d8eba | 75 | (MESSAGE_RANGE_TYPE) argv[2], |
| gawas | 0:ccdea31d8eba | 76 | (PORT_DIRECTION_TYPE) argv[3], |
| gawas | 0:ccdea31d8eba | 77 | (QUEUING_DISCIPLINE_TYPE) argv[4], |
| gawas | 0:ccdea31d8eba | 78 | (QUEUING_PORT_ID_TYPE *) argv[5], |
| gawas | 0:ccdea31d8eba | 79 | (RETURN_CODE_TYPE *) argv[6]); |
| gawas | 0:ccdea31d8eba | 80 | break; |
| gawas | 0:ccdea31d8eba | 81 | } |
| gawas | 0:ccdea31d8eba | 82 | case 0xc0ffee0d: |
| gawas | 0:ccdea31d8eba | 83 | { |
| gawas | 0:ccdea31d8eba | 84 | uint8_t argc = 5; |
| gawas | 0:ccdea31d8eba | 85 | uint32_t argv[argc]; |
| gawas | 0:ccdea31d8eba | 86 | |
| gawas | 0:ccdea31d8eba | 87 | while(argc--) { |
| gawas | 0:ccdea31d8eba | 88 | argv[argc] = pop(&stack->R2); |
| gawas | 0:ccdea31d8eba | 89 | } |
| gawas | 0:ccdea31d8eba | 90 | |
| gawas | 0:ccdea31d8eba | 91 | recieve_queuing_message( |
| gawas | 0:ccdea31d8eba | 92 | (QUEUING_PORT_ID_TYPE) argv[0], |
| gawas | 0:ccdea31d8eba | 93 | (SYSTEM_TIME_TYPE) argv[1], |
| gawas | 0:ccdea31d8eba | 94 | (MESSAGE_ADDR_TYPE) argv[2], |
| gawas | 0:ccdea31d8eba | 95 | (MESSAGE_SIZE_TYPE *) argv[3], |
| gawas | 0:ccdea31d8eba | 96 | (RETURN_CODE_TYPE *) argv[4]); |
| gawas | 0:ccdea31d8eba | 97 | break; |
| gawas | 0:ccdea31d8eba | 98 | } |
| gawas | 0:ccdea31d8eba | 99 | case 0xc0ffee0e: |
| gawas | 0:ccdea31d8eba | 100 | { |
| gawas | 0:ccdea31d8eba | 101 | uint8_t argc = 5; |
| gawas | 0:ccdea31d8eba | 102 | uint32_t argv[argc]; |
| gawas | 0:ccdea31d8eba | 103 | |
| gawas | 0:ccdea31d8eba | 104 | while(argc--) { |
| gawas | 0:ccdea31d8eba | 105 | argv[argc] = pop(&stack->R2); |
| gawas | 0:ccdea31d8eba | 106 | } |
| gawas | 0:ccdea31d8eba | 107 | |
| gawas | 0:ccdea31d8eba | 108 | send_queuing_message( |
| gawas | 0:ccdea31d8eba | 109 | (QUEUING_PORT_ID_TYPE) argv[0], |
| gawas | 0:ccdea31d8eba | 110 | (MESSAGE_ADDR_TYPE) argv[1], |
| gawas | 0:ccdea31d8eba | 111 | (MESSAGE_SIZE_TYPE) argv[2], |
| gawas | 0:ccdea31d8eba | 112 | (SYSTEM_TIME_TYPE) argv[3], |
| gawas | 0:ccdea31d8eba | 113 | (RETURN_CODE_TYPE *) argv[4]); |
| gawas | 0:ccdea31d8eba | 114 | break; |
| gawas | 0:ccdea31d8eba | 115 | } |
| gawas | 0:ccdea31d8eba | 116 | case 0xc0ffee0f: |
| gawas | 0:ccdea31d8eba | 117 | { |
| gawas | 0:ccdea31d8eba | 118 | uint8_t argc = 3; |
| gawas | 0:ccdea31d8eba | 119 | uint32_t argv[argc]; |
| gawas | 0:ccdea31d8eba | 120 | |
| gawas | 0:ccdea31d8eba | 121 | while(argc--) { |
| gawas | 0:ccdea31d8eba | 122 | argv[argc] = pop(&stack->R2); |
| gawas | 0:ccdea31d8eba | 123 | } |
| gawas | 0:ccdea31d8eba | 124 | |
| gawas | 0:ccdea31d8eba | 125 | get_queuing_port_id( |
| gawas | 0:ccdea31d8eba | 126 | (char *) argv[0], |
| gawas | 0:ccdea31d8eba | 127 | (QUEUING_PORT_ID_TYPE *) argv[1], |
| gawas | 0:ccdea31d8eba | 128 | (RETURN_CODE_TYPE *) argv[2]); |
| gawas | 0:ccdea31d8eba | 129 | break; |
| gawas | 0:ccdea31d8eba | 130 | } |
| gawas | 0:ccdea31d8eba | 131 | case 0xc0ffee10: |
| gawas | 0:ccdea31d8eba | 132 | { |
| gawas | 0:ccdea31d8eba | 133 | uint8_t argc = 3; |
| gawas | 0:ccdea31d8eba | 134 | uint32_t argv[argc]; |
| gawas | 0:ccdea31d8eba | 135 | |
| gawas | 0:ccdea31d8eba | 136 | while(argc--) { |
| gawas | 0:ccdea31d8eba | 137 | argv[argc] = pop(&stack->R2); |
| gawas | 0:ccdea31d8eba | 138 | } |
| gawas | 0:ccdea31d8eba | 139 | |
| gawas | 0:ccdea31d8eba | 140 | get_queuing_port_status( |
| gawas | 0:ccdea31d8eba | 141 | (QUEUING_PORT_ID_TYPE) argv[0], |
| gawas | 0:ccdea31d8eba | 142 | (QUEUING_PORT_STATUS_TYPE *) argv[1], |
| gawas | 0:ccdea31d8eba | 143 | (RETURN_CODE_TYPE *) argv[2]); |
| gawas | 0:ccdea31d8eba | 144 | break; |
| gawas | 0:ccdea31d8eba | 145 | } |
| gawas | 0:ccdea31d8eba | 146 | case 0xc0ffee11: |
| gawas | 0:ccdea31d8eba | 147 | { |
| gawas | 0:ccdea31d8eba | 148 | process_stop_self(); |
| gawas | 0:ccdea31d8eba | 149 | break; |
| gawas | 0:ccdea31d8eba | 150 | } |
| gawas | 0:ccdea31d8eba | 151 | default: |
| gawas | 0:ccdea31d8eba | 152 | break; |
| gawas | 0:ccdea31d8eba | 153 | } |
| gawas | 0:ccdea31d8eba | 154 | |
| gawas | 0:ccdea31d8eba | 155 | /* Enable sysTick */ |
| gawas | 0:ccdea31d8eba | 156 | SysTick->CTRL = |
| gawas | 0:ccdea31d8eba | 157 | SysTick_CTRL_CLKSOURCE_Msk | |
| gawas | 0:ccdea31d8eba | 158 | SysTick_CTRL_TICKINT_Msk | |
| gawas | 0:ccdea31d8eba | 159 | SysTick_CTRL_ENABLE_Msk; |
| gawas | 0:ccdea31d8eba | 160 | } |
| gawas | 0:ccdea31d8eba | 161 |