autosar 框架代码篇 osif 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.cvoid vTaskDelay( const TickType_t xTicksToDelay )3.uint32_t OSIF_GetMilliseconds(void);freertos 对应source/task.cTickType_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.cvoid vTaskStartScheduler( void )