1 Microsoft's Azure RTOS ThreadX for Cortex-A5x 2 3 Using the ARM Compiler 6 & DS 4 51. Open the Azure RTOS Workspace 6 7In order to build the ThreadX library and the ThreadX demonstration first load 8the Azure RTOS Workspace, which is located inside your ThreadX installation 9directory. 10 11Note: the workspace and projects were made using DS-5, so DS will prompt you 12to migrate the projects. This is expected, so please do so. 13 142. Building the ThreadX run-time Library 15 16Building the ThreadX library is easy; simply select the Eclipse project file 17"tx" and then select the build button. You should now observe the compilation 18and assembly of the ThreadX library. This project build produces the ThreadX 19library file tx.a. 20 21 223. Demonstration System 23 24The ThreadX demonstration is designed to execute under the DS debugger on the 25VE-AEMv8x1 Bare Metal simulator. 26 27Building the demonstration is easy; simply open the workspace file, select the 28sample_threadx project, and select the build button. Next, right-click on the 29project and select "Debug As -> Debug Configurations". The debugger is setup 30for VE_AEMv8x1 Bare Metal Debug, so selecting "Debug" will launch the simulator, 31load the sample_threadx.axf ELF file and run to main. You are now ready to 32execute the ThreadX demonstration. 33 34 354. System Initialization 36 37The entry point in ThreadX for the Cortex-A5x using ARM tools is at label 38start64. This is defined within the ARM compiler's startup code. In addition, 39this is where all static and global pre-set C variable initialization processing 40takes place. 41 42The ThreadX tx_initialize_low_level.s file is responsible for determining the 43first available RAM address for use by the application, which is supplied as the 44sole input parameter to your application definition function, tx_application_define. 45 46 475. Register Usage and Stack Frames 48 49The 64-bit ARM compiler assumes that registers x0-x18 are scratch registers 50for each function. All other registers used by a C function must be preserved 51by the function. ThreadX takes advantage of this in situations where a context 52switch happens as a result of making a ThreadX service call (which is itself a 53C function). In such cases, the saved context of a thread is only the 54non-scratch registers. 55 56The following defines the saved context stack frames for context switches 57that occur as a result of interrupt handling or from thread-level API calls. 58All suspended threads have one of these two types of stack frames. The top 59of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the 60associated thread control block TX_THREAD. 61 62 63FP not enabled and TX_THREAD.tx_thread_fp_enable == 0: 64 65 Offset Interrupted Stack Frame Non-Interrupt Stack Frame 66 67 0x000 SPSR DAIF 68 0x008 ELR 0 69 0x010 x28 x27 70 0x018 reserved x28 71 0x020 x26 x25 72 0x028 x27 x26 73 0x030 x24 x23 74 0x038 x25 x24 75 0x040 x22 x21 76 0x048 x23 x22 77 0x050 x20 x19 78 0x058 x21 x20 79 0x060 x18 x29 80 0x068 x19 x30 81 0x070 x16 82 0x078 x17 83 0x080 x14 84 0x088 x15 85 0x090 x12 86 0x098 x13 87 0x0A0 x10 88 0x0A8 x11 89 0x0B0 x8 90 0x0B8 x9 91 0x0C0 x6 92 0x0C8 x7 93 0x0D0 x4 94 0x0D8 x5 95 0x0E0 x2 96 0x0E8 x3 97 0x0F0 x0 98 0x0F8 x1 99 0x100 x29 100 0x108 x30 101 102 103FP enabled and TX_THREAD.tx_thread_fp_enable == 1: 104 105 Offset Interrupted Stack Frame Non-Interrupt Stack Frame 106 107 0x000 SPSR DAIF 108 0x008 ELR 0 109 0x010 FPSR FPSR 110 0x018 FPCR FPCR 111 0x020 q30 q14 112 0x030 q31 q15 113 0x040 q28 q12 114 0x050 q29 q13 115 0x060 q26 q10 116 0x070 q27 q11 117 0x080 q24 q8 118 0x090 q25 q9 119 0x0A0 q22 x27 120 0x0A8 x28 121 0x0B0 q23 x25 122 0x0B8 x26 123 0x0C0 q20 x23 124 0x0C8 x24 125 0x0D0 q21 x21 126 0x0D8 x22 127 0x0E0 q18 x19 128 0x0E8 x20 129 0x0F0 q19 x29 130 0x0F8 x30 131 0x100 q16 132 0x110 q17 133 0x120 q14 134 0x130 q15 135 0x140 q12 136 0x150 q13 137 0x160 q10 138 0x170 q11 139 0x180 q8 140 0x190 q9 141 0x1A0 q6 142 0x1B0 q7 143 0x1C0 q4 144 0x1D0 q5 145 0x1E0 q2 146 0x1F0 q3 147 0x200 q0 148 0x210 q1 149 0x220 x28 150 0x228 reserved 151 0x230 x26 152 0x238 x27 153 0x240 x24 154 0x248 x25 155 0x250 x22 156 0x258 x23 157 0x260 x20 158 0x268 x21 159 0x270 x18 160 0x278 x19 161 0x280 x16 162 0x288 x17 163 0x290 x14 164 0x298 x15 165 0x2A0 x12 166 0x2A8 x13 167 0x2B0 x10 168 0x2B8 x11 169 0x2C0 x8 170 0x2C8 x9 171 0x2D0 x6 172 0x2D8 x7 173 0x2E0 x4 174 0x2E8 x5 175 0x2F0 x2 176 0x2F8 x3 177 0x300 x0 178 0x308 x1 179 0x310 x29 180 0x318 x30 181 182 183 1846. Improving Performance 185 186The distribution version of ThreadX is built without any compiler optimizations. 187This makes it easy to debug because you can trace or set breakpoints inside of 188ThreadX itself. Of course, this costs some performance. To make it run faster, 189you can change the project settings to the desired compiler optimization level. 190 191In addition, you can eliminate the ThreadX basic API error checking by 192compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING 193defined. 194 195 1967. Interrupt Handling 197 198ThreadX provides complete and high-performance interrupt handling for Cortex-A5x 199targets. Interrupts handlers for the 64-bit mode of the Cortex-A5x have the following 200format: 201 202 .global irq_handler 203irq_handler: 204 205 STP x29, x30, [sp, #-16]! 206 BL _tx_thread_context_save 207 208 /* Your ISR call goes here! */ 209 BL application_isr_handler 210 211 B _tx_thread_context_restore 212 213By default, ThreadX assumes EL3 level of execution. Running and taking exceptions in EL1 214and EL2 can be done by simply building the ThreadX library with either EL1 or EL2 defined. 215 216 2178. ThreadX Timer Interrupt 218 219ThreadX requires a periodic interrupt source to manage all time-slicing, thread sleeps, 220timeouts, and application timers. Without such a timer interrupt source, these services 221are not functional. However, all other ThreadX services are operational without a 222periodic timer source. 223 224 2259. ARM FP Support 226 227By default, FP support is disabled for each thread. If saving the context of the FP registers 228is needed, the following API call must be made from the context of the application thread - before 229the FP usage: 230 231void tx_thread_fp_enable(void); 232 233After this API is called in the application, FP registers will be saved/restored for this thread if it 234is preempted via an interrupt. All other suspension of the this thread will not require the FP registers 235to be saved/restored. 236 237To disable FP register context saving, simply call the following API: 238 239void tx_thread_fp_disable(void); 240 241 24210. Revision History 243 244For generic code revision information, please refer to the readme_threadx_generic.txt 245file, which is included in your distribution. The following details the revision 246information associated with this specific port of ThreadX: 247 24804-02-2021 Release 6.1.6 changes: 249 tx_port.h Updated macro definition 250 25109-30-2020 Initial ThreadX 6.1 version for Cortex-A5x using ARM tools. 252 253 254Copyright(c) 1996-2020 Microsoft Corporation 255 256 257https://azure.com/rtos 258 259