staticvoidprvPortStartFirstTask(void){
__asm volatile(" ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */" ldr r0, [r0] \n"" ldr r0, [r0] \n"" msr msp, r0 \n"/* Set the msp back to the start of the stack. */" cpsie i \n"/* Globally enable interrupts. */" cpsie f \n"" dsb \n"" isb \n"" svc 0 \n"/* 触发SVC异常,在SVC中断服务函数中启动第一个任务. */" nop \n"" .ltorg \n");}
typedefstructtskTaskControlBlock/* The old naming convention is used to prevent breaking kernel aware debuggers. */{volatile StackType_t * pxTopOfStack;/*< 指向任务的栈顶.任务之间切换需要用到 */
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> portUSING_MPU_WRAPPERS <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
xMPU_SETTINGS xMPUSettings<span class="token punctuation">;</span> <span class="token comment">/*< 使用MPU时需要用到. */</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
ListItem_t xStateListItem<span class="token punctuation">;</span> <span class="token comment">/*< 状态链表节点,可以将该节点挂在不同状态(就绪、堵塞、挂起)链表中 */</span>
ListItem_t xEventListItem<span class="token punctuation">;</span> <span class="token comment">/*< 链表节点,可以将该节点挂在不同队列链表中,实现队列堵塞等功能 */</span>
UBaseType_t uxPriority<span class="token punctuation">;</span> <span class="token comment">/*< 任务优先级 */</span>
StackType_t <span class="token operator">*</span> pxStack<span class="token punctuation">;</span> <span class="token comment">/*< 指向任务栈起始位置 */</span>
<span class="token keyword">char</span> pcTaskName<span class="token punctuation">[</span> configMAX_TASK_NAME_LEN <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">/*< 任务名字. */</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> <span class="token punctuation">(</span> portSTACK_GROWTH <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span> configRECORD_STACK_HIGH_ADDRESS <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span></span></span>
StackType_t <span class="token operator">*</span> pxEndOfStack<span class="token punctuation">;</span> <span class="token comment">/*< Points to the highest valid address for the stack. */</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> portCRITICAL_NESTING_IN_TCB <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
UBaseType_t uxCriticalNesting<span class="token punctuation">;</span> <span class="token comment">/*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> configUSE_TRACE_FACILITY <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
UBaseType_t uxTCBNumber<span class="token punctuation">;</span> <span class="token comment">/*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */</span>
UBaseType_t uxTaskNumber<span class="token punctuation">;</span> <span class="token comment">/*< Stores a number specifically for use by third party trace code. */</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> configUSE_MUTEXES <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
UBaseType_t uxBasePriority<span class="token punctuation">;</span> <span class="token comment">/*< The priority last assigned to the task - used by the priority inheritance mechanism. */</span>
UBaseType_t uxMutexesHeld<span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> configUSE_APPLICATION_TASK_TAG <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
TaskHookFunction_t pxTaskTag<span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> configNUM_THREAD_LOCAL_STORAGE_POINTERS <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">)</span></span></span>
<span class="token keyword">void</span> <span class="token operator">*</span> pvThreadLocalStoragePointers<span class="token punctuation">[</span> configNUM_THREAD_LOCAL_STORAGE_POINTERS <span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> configGENERATE_RUN_TIME_STATS <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
<span class="token class-name">uint32_t</span> ulRunTimeCounter<span class="token punctuation">;</span> <span class="token comment">/*< Stores the amount of time the task has spent in the Running state. */</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> configUSE_NEWLIB_REENTRANT <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
<span class="token comment">/* Allocate a Newlib reent structure that is specific to this task.
* Note Newlib support has been included by popular demand, but is not
* used by the FreeRTOS maintainers themselves. FreeRTOS is not
* responsible for resulting newlib operation. User must be familiar with
* newlib and must provide system-wide implementations of the necessary
* stubs. Be warned that (at the time of writing) the current newlib design
* implements a system-wide malloc() that must be provided with locks.
*
* See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
* for additional information. */</span>
<span class="token keyword">struct</span> <span class="token class-name">_reent</span> xNewLib_reent<span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> configUSE_TASK_NOTIFICATIONS <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
<span class="token keyword">volatile</span> <span class="token class-name">uint32_t</span> ulNotifiedValue<span class="token punctuation">[</span> configTASK_NOTIFICATION_ARRAY_ENTRIES <span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">volatile</span> <span class="token class-name">uint8_t</span> ucNotifyState<span class="token punctuation">[</span> configTASK_NOTIFICATION_ARRAY_ENTRIES <span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token comment">/* See the comments in FreeRTOS.h with the definition of
* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE <span class="token operator">!=</span> <span class="token number">0</span> <span class="token punctuation">)</span> </span><span class="token comment">/*lint !e731 !e9029 Macro has been consolidated for readability reasons. */</span></span>
<span class="token class-name">uint8_t</span> ucStaticallyAllocated<span class="token punctuation">;</span> <span class="token comment">/*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> INCLUDE_xTaskAbortDelay <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
<span class="token class-name">uint8_t</span> ucDelayAborted<span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression"><span class="token punctuation">(</span> configUSE_POSIX_ERRNO <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span></span></span>
<span class="token keyword">int</span> iTaskErrno<span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>