osif 主要对针对freertos系统进行二次封装。包含osif.c/osif.h, osif_task.c/osif_task.h。
osif.h
#ifndef __OSIF_H__
#define __OSIF_H__
/******************************************************************************
* Includes
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include "FreerRTOS.h"
#include "task.h"
#include "queue.h"
#include "timers.h"
#include "event_groups.h"
#include "semphr.h"
/******************************************************************************
* Typedefs
******************************************************************************/
typedef enum
{
OSIF_STATUS_SUCCESS = 0,
OSIF_STATUS_ERROR = 1,
OSIF_STATUS_BUSY = 2,
OSIF_STATUS_TIMEOUT = 3,
OSIF_STATUS_NO_MEMORY = 4,
OSIF_STATUS_INVALID_PARAM = 5,
OSIF_STATUS_NOT_READY = 6,
OSIF_STATUS_UNSUPPORTED = 7
}OSIF_STATUS_T;
typedef SemaphoreHandle_t OS_Mutex_Handler_t;
typedef SemaphoreHandle_t OS_Binary_Handler_t;
typedef QueueHandle_t OS_Queue_Handler_t;
typedef TimerHandle_t OS_Timer_t;
typedef TaskHandle_t OS_Task_Handler_t;
typedef EventGroupHandle_t OS_EvenGroup_Handler_t;
/******************************************************************************
* Global Variables
******************************************************************************/
/******************************************************************************
* Function Prototypes
******************************************************************************/
bool OSIF_IsIsrContext(void);
void OSIF_TimeDelay(const uint32_t delay);
uint32_t OSIF_GetMilliseconds(void);
OSIF_STATUS_T OSIF_Mutex_Static_Create(OS_Mutex_Handler_t *mutex, StaticSemaphore_t *Semaphore_Buffer);
OSIF_STATUS_T OSIF_Mutex_Lock(const OS_Mutex_Handler_t *mutex, const uint32_t timeout);
OSIF_STATUS_T OSIF_Mutex_Unlock(const Os_Mutex_Handler_t *mutex);
OSIF_STATUS_T OSIF_Sem_Static_Create(OS_Binary_Handler_t *sem, const uint8_t value, StaticSemaphore_t *Sem_Buffer);
OSIF_STATUS_T OSIF_Sem_Wait(const OS_Binary_Handler_t *sem, const uint32_t timeout);
OSIF_STATUS_T OSIF_Sem_Post(const OS_Binary_Handler_t *sem);
OS_Queue_Handler_t OSIF_Generic_Queue_Static_Create(const uint32_t Queue_len, const uint32_t Queue_Size, uint8_t *Queue_Storage, StaticQueue_t *pStaticQueue);
OSIF_STATUS_T OSIF_Queue_Send(OS_Queue_Handler_t queue, const void *data,
OSIF_STATUS_T OSIF_Queue_Receive(OS_Queue_Handler_t queue, const void *data, TickType_t WaitTime, bool fromISR);
OSIF_STATUS_T OSIF_EventGroup_Static_Create(OS_EvenGroup_Handler_t *Event, StaticEventGroup_t *pStaticEventGroup);
OSIF_STATUS_T OSIF_EventGroup_Set_Bits(OS_EvenGroup_Handler_t event_groups, const uint32_t bitToSet);
OSIF_STATUS_T OSIF_Queue_Receive(OS_Queue_Handler_t queue, const void *data, TickType_t WaitTime, bool fromISR);
OSIF_STATUS_T OSIF_EventGroup_Static_Create(OS_EvenGroup_Handler_t *Event, StaticEventGroup_t *pStaticEventGroup);
OSIF_STATUS_T OSIF_EventGroup_Set_Bits(OS_EvenGroup_Handler_t event_groups, const uint32_t bitToSet);
OSIF_STATUS_T OSIF_EventGroup_WaitBits(OS_EvenGroup_Handler_t event_groups, const uint32_t bitsToWaitFor, const bool clearOnExit, const bool waitForAllBits, const uint32_t timeout, uint32_t *pResultBits);
void OSIF_Start_Schedule(void);
/******************************************************************************
* Inline Functions
******************************************************************************/
/******************************************************************************
* Macros
******************************************************************************/
#define OSIF_VERSION "1.0.0"
#define OSIF_WAIT_FOREVER (0xFFFFFFFF)
//scheduler not start
#define SCHEDULER_READY (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
#define OSIF_UNIFIED_ENTER_CRITICAL(saveVar) \
do{\
if(OSIF_IsIsrContext()) \
{ \
saveVar = taskENTER_CRITICAL_FROM_ISR(); \
} \
else \
{\
taskENTER_CRITICAL();\
}\
}\
while(0)
#define OSIF_UNIFIED_EXIT_CRITICAL(saveVar) \
do{\
if(OSIF_IsIsrContext())\
{\
taskEXIT_CRITICAL_FROM_ISR(saveVar)\
}\
else \
{\
taskEXIT_CRITICAL();\
}\
}while(0)
#define OSIF_TASK_SUSPEND_SCHEDULER() vTaskSuspendAll();
#define OSIF_TASK_RESUME_SCHEDULER() vTaskResumeAll();
#endif
//封装接口映射
1.bool OSIF_IsIsrContext(void);
freertos 对应/source/portable/ port.c, BaseType_t xPortIsInsideInterrupt( void )
2.void OSIF_TimeDelay(const uint32_t delay);
freertos 对应source/task.c
void vTaskDelay( const TickType_t xTicksToDelay )
3.uint32_t OSIF_GetMilliseconds(void);
freertos 对应source/task.c
TickType_t xTaskGetTickCountFromISR( void )和TickType_t xTaskGetTickCount( void )
4.OSIF_STATUS_T OSIF_Mutex_Static_Create(OS_Mutex_Handler_t *mutex, StaticSemaphore_t *Semaphore_Buffer);
freertos 对应inlcude/semphr.h
#define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) )
5.OSIF_STATUS_T OSIF_Mutex_Lock(const OS_Mutex_Handler_t *mutex, const uint32_t timeout);
freertos 对应inlcude/semphr.h
#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) )
6.OSIF_STATUS_T OSIF_Mutex_Unlock(const Os_Mutex_Handler_t *mutex);
freertos 对应inlcude/semphr.h
#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
7.OS_Queue_Handler_t OSIF_Generic_Queue_Static_Create(const uint32_t Queue_len, const uint32_t Queue_Size, uint8_t *Queue_Storage, StaticQueue_t *pStaticQueue);
freertos 对应inlcude/queue.h:
#define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) )
8.OSIF_STATUS_T OSIF_Queue_Send(OS_Queue_Handler_t queue, const void *data, TickType_t WaitTime, bool fromISR);
freertos 对应inlcude/queue.h:
#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \
xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )
#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) \
xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )
9.OSIF_STATUS_T OSIF_Queue_Receive(OS_Queue_Handler_t queue, const void *data, TickType_t WaitTime, bool fromISR);
freertos 对应source/queue.c:
BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue,
void * const pvBuffer,
BaseType_t * const pxHigherPriorityTaskWoken )
BaseType_t xQueueReceive( QueueHandle_t xQueue,
void * const pvBuffer,
TickType_t xTicksToWait )
10.OSIF_STATUS_T OSIF_EventGroup_Static_Create(OS_EvenGroup_Handler_t *Event, StaticEventGroup_t *pStaticEventGroup);
freertos 对应source/event_groups.c:
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer )
11.OSIF_STATUS_T OSIF_EventGroup_Set_Bits(OS_EvenGroup_Handler_t event_groups, const uint32_t bitToSet);
freertos 对应source/event_groups.c:
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
12.
OSIF_STATUS_T OSIF_EventGroup_WaitBits(OS_EvenGroup_Handler_t event_groups, const uint32_t bitsToWaitFor, const bool clearOnExit, const bool waitForAllBits, const uint32_t timeout, uint32_t *pResultBits);
freertos 对应source/event_groups.c:
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
TickType_t xTicksToWait )
13.void OSIF_Start_Schedule(void);
freertos 对应source/task.c
void vTaskStartScheduler( void )