freeRTOS移植

win32

freeRTOS v6.1.1

portable.h

memory

TCB

Ln167~Ln187(port.c)

pxPortInitialiseStack

memory management

在heap_n.c中实现

void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION;
void vPortFree( void *pv ) PRIVILEGED_FUNCTION;

如果MPU可用,则使用Ln105~106(mpu_wrappers.h)

void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION;
size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION;

task

此实现在Ln189Ln262、Ln401Ln406(port.c)

portBASE_TYPE xPortStartScheduler( void ) PRIVILEGED_FUNCTION;
void vPortEndScheduler( void ) PRIVILEGED_FUNCTION;

注意:在windows系统下end是调用了TerminateProcess(WinBase.h Ln3398)

portmacro.h

Critical

此实现在Ln452~Ln513(port.c)

void vPortEnterCritical( void );
void vPortExitCritical( void );

#define portENTER_CRITICAL()		vPortEnterCritical()
#define portEXIT_CRITICAL()			vPortExitCritical()

Interrupt

#define portDISABLE_INTERRUPTS()
#define portENABLE_INTERRUPTS()

此实现在Ln408~Ln450(port.c)

void vPortGenerateSimulatedInterrupt( unsigned long ulInterruptNumber );
void vPortSetInterruptHandler( unsigned long ulInterruptNumber, unsigned long (*pvHandler)( void ) );

#define portYIELD()					vPortGenerateSimulatedInterrupt( portINTERRUPT_YIELD )

other

thread

在portmacro.h定义,在Ln377~Ln399(port.c)实现

void vPortDeleteThread( void *pvThreadToDelete );

Simulated

在port.c中定义并针对具体平台(比如windows)实现

总开关:

static void prvProcessSimulatedInterrupts( void );

具体操作:

static unsigned long prvProcessDeleteThreadInterrupt( void );
static unsigned long prvProcessYieldInterrupt( void );
static unsigned long prvProcessTickInterrupt( void );

模拟tick

static DWORD WINAPI prvSimulatedPeripheralTimer( LPVOID lpParameter );