ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

autosar 框架代码篇 osif

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.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 )

返回列表