mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-20 05:21:59 -04:00
Kernel updates:
- Add user configurable thread local storage array, with get/set access function.
This commit is contained in:
parent
51aa373c4c
commit
dfdc319518
|
@ -227,7 +227,7 @@ void vRegisterSampleCLICommands( void )
|
||||||
|
|
||||||
static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
||||||
{
|
{
|
||||||
const char *const pcHeader = " State\tPriority\tStack\t#\r\n************************************************\r\n";
|
const char *const pcHeader = " State Priority Stack #\r\n************************************************\r\n";
|
||||||
BaseType_t xSpacePadding;
|
BaseType_t xSpacePadding;
|
||||||
|
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
|
|
|
@ -149,7 +149,6 @@ referenced anyway. */
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
#define INCLUDE_vTaskPrioritySet 1
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
#define INCLUDE_uxTaskPriorityGet 1
|
||||||
#define INCLUDE_vTaskDelete 1
|
#define INCLUDE_vTaskDelete 1
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
#define INCLUDE_vTaskSuspend 1
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
#define INCLUDE_vTaskDelayUntil 1
|
||||||
#define INCLUDE_vTaskDelay 1
|
#define INCLUDE_vTaskDelay 1
|
||||||
|
|
|
@ -18,6 +18,7 @@ _HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x4;
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr : ORIGIN = 0x00000050, LENGTH = 0x0003FFB0
|
microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr : ORIGIN = 0x00000050, LENGTH = 0x0003FFB0
|
||||||
|
mig_7series_0 : ORIGIN = 0x80000000, LENGTH = 0x40000000
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Specify the default entry point to the program */
|
/* Specify the default entry point to the program */
|
||||||
|
@ -48,15 +49,15 @@ SECTIONS
|
||||||
*(.text)
|
*(.text)
|
||||||
*(.text.*)
|
*(.text.*)
|
||||||
*(.gnu.linkonce.t.*)
|
*(.gnu.linkonce.t.*)
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.init : {
|
.init : {
|
||||||
KEEP (*(.init))
|
KEEP (*(.init))
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.fini : {
|
.fini : {
|
||||||
KEEP (*(.fini))
|
KEEP (*(.fini))
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.ctors : {
|
.ctors : {
|
||||||
__CTOR_LIST__ = .;
|
__CTOR_LIST__ = .;
|
||||||
|
@ -67,7 +68,7 @@ SECTIONS
|
||||||
KEEP (*(.ctors))
|
KEEP (*(.ctors))
|
||||||
__CTOR_END__ = .;
|
__CTOR_END__ = .;
|
||||||
___CTORS_END___ = .;
|
___CTORS_END___ = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.dtors : {
|
.dtors : {
|
||||||
__DTOR_LIST__ = .;
|
__DTOR_LIST__ = .;
|
||||||
|
@ -78,7 +79,7 @@ SECTIONS
|
||||||
KEEP (*(.dtors))
|
KEEP (*(.dtors))
|
||||||
PROVIDE(__DTOR_END__ = .);
|
PROVIDE(__DTOR_END__ = .);
|
||||||
PROVIDE(___DTORS_END___ = .);
|
PROVIDE(___DTORS_END___ = .);
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.rodata : {
|
.rodata : {
|
||||||
__rodata_start = .;
|
__rodata_start = .;
|
||||||
|
@ -86,7 +87,7 @@ SECTIONS
|
||||||
*(.rodata.*)
|
*(.rodata.*)
|
||||||
*(.gnu.linkonce.r.*)
|
*(.gnu.linkonce.r.*)
|
||||||
__rodata_end = .;
|
__rodata_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.sdata2 : {
|
.sdata2 : {
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
|
@ -96,7 +97,7 @@ SECTIONS
|
||||||
*(.gnu.linkonce.s2.*)
|
*(.gnu.linkonce.s2.*)
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
__sdata2_end = .;
|
__sdata2_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.sbss2 : {
|
.sbss2 : {
|
||||||
__sbss2_start = .;
|
__sbss2_start = .;
|
||||||
|
@ -104,7 +105,7 @@ SECTIONS
|
||||||
*(.sbss2.*)
|
*(.sbss2.*)
|
||||||
*(.gnu.linkonce.sb2.*)
|
*(.gnu.linkonce.sb2.*)
|
||||||
__sbss2_end = .;
|
__sbss2_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.data : {
|
.data : {
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
@ -113,31 +114,31 @@ SECTIONS
|
||||||
*(.data.*)
|
*(.data.*)
|
||||||
*(.gnu.linkonce.d.*)
|
*(.gnu.linkonce.d.*)
|
||||||
__data_end = .;
|
__data_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.got : {
|
.got : {
|
||||||
*(.got)
|
*(.got)
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.got1 : {
|
.got1 : {
|
||||||
*(.got1)
|
*(.got1)
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.got2 : {
|
.got2 : {
|
||||||
*(.got2)
|
*(.got2)
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.eh_frame : {
|
.eh_frame : {
|
||||||
*(.eh_frame)
|
*(.eh_frame)
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.jcr : {
|
.jcr : {
|
||||||
*(.jcr)
|
*(.jcr)
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.gcc_except_table : {
|
.gcc_except_table : {
|
||||||
*(.gcc_except_table)
|
*(.gcc_except_table)
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.sdata : {
|
.sdata : {
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
|
@ -146,7 +147,7 @@ SECTIONS
|
||||||
*(.sdata.*)
|
*(.sdata.*)
|
||||||
*(.gnu.linkonce.s.*)
|
*(.gnu.linkonce.s.*)
|
||||||
__sdata_end = .;
|
__sdata_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.sbss (NOLOAD) : {
|
.sbss (NOLOAD) : {
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
@ -156,7 +157,7 @@ SECTIONS
|
||||||
*(.gnu.linkonce.sb.*)
|
*(.gnu.linkonce.sb.*)
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
__sbss_end = .;
|
__sbss_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.tdata : {
|
.tdata : {
|
||||||
__tdata_start = .;
|
__tdata_start = .;
|
||||||
|
@ -164,7 +165,7 @@ SECTIONS
|
||||||
*(.tdata.*)
|
*(.tdata.*)
|
||||||
*(.gnu.linkonce.td.*)
|
*(.gnu.linkonce.td.*)
|
||||||
__tdata_end = .;
|
__tdata_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.tbss : {
|
.tbss : {
|
||||||
__tbss_start = .;
|
__tbss_start = .;
|
||||||
|
@ -172,7 +173,7 @@ SECTIONS
|
||||||
*(.tbss.*)
|
*(.tbss.*)
|
||||||
*(.gnu.linkonce.tb.*)
|
*(.gnu.linkonce.tb.*)
|
||||||
__tbss_end = .;
|
__tbss_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.bss (NOLOAD) : {
|
.bss (NOLOAD) : {
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
@ -183,7 +184,7 @@ SECTIONS
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__bss_end = .;
|
__bss_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 );
|
_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 );
|
||||||
|
|
||||||
|
@ -197,7 +198,7 @@ _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );
|
||||||
_heap_start = .;
|
_heap_start = .;
|
||||||
. += _HEAP_SIZE;
|
. += _HEAP_SIZE;
|
||||||
_heap_end = .;
|
_heap_end = .;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
.stack (NOLOAD) : {
|
.stack (NOLOAD) : {
|
||||||
_stack_end = .;
|
_stack_end = .;
|
||||||
|
@ -205,7 +206,7 @@ _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
_stack = .;
|
_stack = .;
|
||||||
__stack = _stack;
|
__stack = _stack;
|
||||||
} > microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr
|
} > mig_7series_0
|
||||||
|
|
||||||
_end = .;
|
_end = .;
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,12 +168,14 @@ static void prvSetupHardware( void )
|
||||||
|
|
||||||
#if defined( XPAR_MICROBLAZE_USE_ICACHE ) && ( XPAR_MICROBLAZE_USE_ICACHE != 0 )
|
#if defined( XPAR_MICROBLAZE_USE_ICACHE ) && ( XPAR_MICROBLAZE_USE_ICACHE != 0 )
|
||||||
{
|
{
|
||||||
|
Xil_ICacheInvalidate();
|
||||||
Xil_ICacheEnable();
|
Xil_ICacheEnable();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined( XPAR_MICROBLAZE_USE_DCACHE ) && ( XPAR_MICROBLAZE_USE_DCACHE != 0 )
|
#if defined( XPAR_MICROBLAZE_USE_DCACHE ) && ( XPAR_MICROBLAZE_USE_DCACHE != 0 )
|
||||||
{
|
{
|
||||||
|
Xil_DCacheInvalidate();
|
||||||
Xil_DCacheEnable();
|
Xil_DCacheEnable();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -195,6 +195,10 @@ extern "C" {
|
||||||
#define configUSE_APPLICATION_TASK_TAG 0
|
#define configUSE_APPLICATION_TASK_TAG 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS
|
||||||
|
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef INCLUDE_uxTaskGetStackHighWaterMark
|
#ifndef INCLUDE_uxTaskGetStackHighWaterMark
|
||||||
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1158,6 +1158,18 @@ constant. */
|
||||||
#endif /* configUSE_APPLICATION_TASK_TAG ==1 */
|
#endif /* configUSE_APPLICATION_TASK_TAG ==1 */
|
||||||
#endif /* ifdef configUSE_APPLICATION_TASK_TAG */
|
#endif /* ifdef configUSE_APPLICATION_TASK_TAG */
|
||||||
|
|
||||||
|
#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )
|
||||||
|
|
||||||
|
/* Each task contains an array of pointers that is dimensioned by the
|
||||||
|
configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The
|
||||||
|
kernel does not use the pointers itself, so the application writer can use
|
||||||
|
the pointers for any purpose they wish. The following two functions are
|
||||||
|
used to set and query a pointer respectively. */
|
||||||
|
void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue );
|
||||||
|
void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex );
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task.h
|
* task.h
|
||||||
* <pre>BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );</pre>
|
* <pre>BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );</pre>
|
||||||
|
|
|
@ -168,6 +168,10 @@ typedef struct tskTaskControlBlock
|
||||||
TaskHookFunction_t pxTaskTag;
|
TaskHookFunction_t pxTaskTag;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )
|
||||||
|
void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
||||||
uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */
|
uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */
|
||||||
#endif
|
#endif
|
||||||
|
@ -2882,6 +2886,15 @@ UBaseType_t x;
|
||||||
}
|
}
|
||||||
#endif /* portUSING_MPU_WRAPPERS */
|
#endif /* portUSING_MPU_WRAPPERS */
|
||||||
|
|
||||||
|
#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )
|
||||||
|
{
|
||||||
|
for( x = 0; x < ( UBaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ )
|
||||||
|
{
|
||||||
|
pxTCB->pvThreadLocalStoragePointers[ x ] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
{
|
{
|
||||||
pxTCB->ulNotifiedValue = 0;
|
pxTCB->ulNotifiedValue = 0;
|
||||||
|
@ -2898,6 +2911,45 @@ UBaseType_t x;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )
|
||||||
|
|
||||||
|
void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue )
|
||||||
|
{
|
||||||
|
TCB_t *pxTCB;
|
||||||
|
|
||||||
|
if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS )
|
||||||
|
{
|
||||||
|
pxTCB = prvGetTCBFromHandle( xTaskToSet );
|
||||||
|
pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )
|
||||||
|
|
||||||
|
void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex )
|
||||||
|
{
|
||||||
|
void *pvReturn = NULL;
|
||||||
|
TCB_t *pxTCB;
|
||||||
|
|
||||||
|
if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS )
|
||||||
|
{
|
||||||
|
pxTCB = prvGetTCBFromHandle( xTaskToQuery );
|
||||||
|
pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pvReturn = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pvReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( portUSING_MPU_WRAPPERS == 1 )
|
#if ( portUSING_MPU_WRAPPERS == 1 )
|
||||||
|
|
||||||
void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, const MemoryRegion_t * const xRegions )
|
void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, const MemoryRegion_t * const xRegions )
|
||||||
|
@ -4100,7 +4152,7 @@ TickType_t uxReturn;
|
||||||
{
|
{
|
||||||
/* The notified task has a priority above the currently
|
/* The notified task has a priority above the currently
|
||||||
executing task so a yield is required. */
|
executing task so a yield is required. */
|
||||||
portYIELD_WITHIN_API();
|
taskYIELD_IF_USING_PREEMPTION();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue