1/*************************************************************************** 2 * Copyright (c) 2024 Microsoft Corporation 3 * 4 * This program and the accompanying materials are made available under the 5 * terms of the MIT License which is available at 6 * https://opensource.org/licenses/MIT. 7 * 8 * SPDX-License-Identifier: MIT 9 **************************************************************************/ 10 11 12/**************************************************************************/ 13/**************************************************************************/ 14/** */ 15/** ThreadX Component */ 16/** */ 17/** Thread */ 18/** */ 19/**************************************************************************/ 20/**************************************************************************/ 21 22#ifdef TX_INCLUDE_USER_DEFINE_FILE 23#include "tx_user.h" 24#endif 25 26 .text 27 .align 4 28 .syntax unified 29/**************************************************************************/ 30/* */ 31/* FUNCTION RELEASE */ 32/* */ 33/* _tx_thread_stack_build Cortex-Mx/AC6 */ 34/* 6.2.1 */ 35/* AUTHOR */ 36/* */ 37/* Scott Larson, Microsoft Corporation */ 38/* */ 39/* DESCRIPTION */ 40/* */ 41/* This function builds a stack frame on the supplied thread's stack. */ 42/* The stack frame results in a fake interrupt return to the supplied */ 43/* function pointer. */ 44/* */ 45/* INPUT */ 46/* */ 47/* thread_ptr Pointer to thread control blk */ 48/* function_ptr Pointer to return function */ 49/* */ 50/* OUTPUT */ 51/* */ 52/* None */ 53/* */ 54/* CALLS */ 55/* */ 56/* None */ 57/* */ 58/* CALLED BY */ 59/* */ 60/* _tx_thread_create Create thread service */ 61/* */ 62/* RELEASE HISTORY */ 63/* */ 64/* DATE NAME DESCRIPTION */ 65/* */ 66/* 06-02-2021 Scott Larson Initial Version 6.1.7 */ 67/* 03-08-2023 Scott Larson Include tx_user.h, */ 68/* resulting in version 6.2.1 */ 69/* */ 70/**************************************************************************/ 71// VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) 72// { 73 .global _tx_thread_stack_build 74 .thumb_func 75_tx_thread_stack_build: 76 77 /* Build a fake interrupt frame. The form of the fake interrupt stack 78 on the Cortex-M should look like the following after it is built: 79 80 Stack Top: 81 LR Interrupted LR (LR at time of PENDSV) 82 r4 Initial value for r4 83 r5 Initial value for r5 84 r6 Initial value for r6 85 r7 Initial value for r7 86 r8 Initial value for r8 87 r9 Initial value for r9 88 r10 Initial value for r10 89 r11 Initial value for r11 90 r0 Initial value for r0 (Hardware stack starts here!!) 91 r1 Initial value for r1 92 r2 Initial value for r2 93 r3 Initial value for r3 94 r12 Initial value for r12 95 lr Initial value for lr 96 pc Initial value for pc 97 xPSR Initial value for xPSR 98 99 Stack Bottom: (higher memory address) */ 100 101 LDR r2, [r0, #16] // Pickup end of stack area 102 BIC r2, r2, #0x7 // Align frame for 8-byte alignment 103 SUB r2, r2, #68 // Subtract frame size 104 LDR r3, =0xFFFFFFFD // Build initial LR value 105 STR r3, [r2, #0] // Save on the stack 106 107 /* Actually build the stack frame. */ 108 109 MOV r3, #0 // Build initial register value 110 STR r3, [r2, #4] // Store initial r4 111 STR r3, [r2, #8] // Store initial r5 112 STR r3, [r2, #12] // Store initial r6 113 STR r3, [r2, #16] // Store initial r7 114 STR r3, [r2, #20] // Store initial r8 115 STR r3, [r2, #24] // Store initial r9 116 STR r3, [r2, #28] // Store initial r10 117 STR r3, [r2, #32] // Store initial r11 118 119 /* Hardware stack follows. */ 120 121 STR r3, [r2, #36] // Store initial r0 122 STR r3, [r2, #40] // Store initial r1 123 STR r3, [r2, #44] // Store initial r2 124 STR r3, [r2, #48] // Store initial r3 125 STR r3, [r2, #52] // Store initial r12 126 MOV r3, #0xFFFFFFFF // Poison EXC_RETURN value 127 STR r3, [r2, #56] // Store initial lr 128 STR r1, [r2, #60] // Store initial pc 129 MOV r3, #0x01000000 // Only T-bit need be set 130 STR r3, [r2, #64] // Store initial xPSR 131 132 /* Setup stack pointer. */ 133 // thread_ptr -> tx_thread_stack_ptr = r2; 134 135 STR r2, [r0, #8] // Save stack pointer in thread's 136 // control block 137 BX lr // Return to caller 138// } 139