8、FreeRTOS的系统功能
FreeRTOS作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理 、信号量、消息队列、内存管理、记录功能,可基本满足较小系统的需要,FreeRTOS内核支持优先级调度算法,每个任务可根据重要程序的不同被赋予一定的优先级,CPU总是让处于就绪态、优先级最高的任务先运行,FreeRTOS内核同时支持轮换调度算法,系统允许在不同任务使用相同的优先级,在没有最高优先级就绪的情况下,同一优先级的任务共享CPU的使用时间。
FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。
void Bsp_int(void)
{
LED_Config();
beep_config();
key_config1();
usart_config(115200);
//GPIOC->ODR |=(0x01<<5);
}
int main(void)
{
BaseType_t xReturn = pdPASS;
Bsp_int();
xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,"AppTask",512,NULL,1,&AppTaskCreatHandle);//接收串口数据
if(pdPASS == xReturn)
{
vTaskStartScheduler();
}
while(1)
{
}
}
/*************
函数名称:AppTaskCreate
函数功能:创建任务
函数参数:无
函数返回值:无
*************/
TaskHandle_t AppTaskCreatHandle = NULL;
TaskHandle_t LED1TaskCreatHandle = NULL;
TaskHandle_t BeepTaskCreatHandle = NULL;
TaskHandle_t KEYsendCreatHandle = NULL;
TaskHandle_t KEYreceiveCreatHandle = NULL;
SemaphoreHandle_t BinarySem_Handle =NULL;
EventGroupHandle_t Event_Handle =NULL;
TaskHandle_t QueueTask_Handle = NULL;
SemaphoreHandle_t semapphore_Handle=NULL;//计数信号量句柄
TimerHandle_t Time_Handle=NULL;
QueueHandle_t testtask;
#define Queue_Len 1
#define Queue_Size 10
void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();//进入临界区
xReturn = xTaskCreate(LEDTask,"LED1",56,NULL,1,&LED1TaskCreatHandle);
if(xReturn ==pdPASS)
{
printf("LED1任务创建成功rn");
}
//xReturn = xTaskCreate(BeepTask,"Beep",56,NULL,2,&BeepTaskCreatHandle);//创建蜂鸣器任务
testtask=xQueueCreate(Queue_Len,Queue_Size);//创建队列
if(testtask!=NULL)
{
printf("创建队列成功 rn");
vTaskDelay(10);
}
xReturn = xTaskCreate(USARTTask,"USART",200,NULL,9,&QueueTask_Handle);//接收串口数据
BinarySem_Handle=xSemaphoreCreateBinary();//创建信号量
if(BinarySem_Handle!=NULL)
{
printf("信号量创建成功 rn");
}
xReturn = xTaskCreate(KEYCreatTask,"KEYsend",56,NULL,7,&KEYsendCreatHandle);//二值信号量的释放任务
xReturn = xTaskCreate(KEY_BeepCreatTask,"KEYreceive",56,NULL,3,&KEYreceiveCreatHandle);//二值信号量的获取任务
Event_Handle = xEventGroupCreate();
if(Event_Handle!=NULL)
{
printf("创建事件成功 rn");
}
xReturn = xTaskCreate(Event_Usart_CreatTask,"Event_UsartCreat",56,NULL,8,&Event_Usart_CreatHandle);//事件置位
xReturn = xTaskCreate(Event_Usart_WaitTask,"Event_WaitCreat",56,NULL,4,&Event_Usart_WaitHandle);//事件等待
//创建计数信号量
semapphore_Handle =xSemaphoreCreateCounting(5,5);
if(semapphore_Handle!=NULL)
{
printf("计数信号量创建成功rn");
}
//创建软件定时器
Time_Handle =xTimerCreate("TIMER",(TickType_t)3000,pdTRUE,(void *)1,(TimerCallbackFunction_t)TimeTask);
if(Time_Handle!=NULL)
{
printf("创建软件定时器成功rn");
xTimerStart(Time_Handle,0);
}
vTaskDelete(AppTaskCreatHandle);
taskEXIT_CRITICAL();//退出临界区
}
/*************
函数名称:LEDTask
函数功能:创建LED任务
函数参数:pvParame
函数返回值:无
*************/
void LEDTask(void * pvParame)
{
while(1)
{
LED1(1);
vTaskDelay(500);
}
}
/*************
函数名称:BeepTask
函数功能:创建Beep任务
函数参数:pvParame
函数返回值:无
*************/
void BeepTask(void * pvParame)
{
while(1)
{
beep_con(0);
vTaskDelay(400);
}
}
/*************
函数名称:USARTTask
函数功能:创建USART任务
函数参数:pvParame
函数返回值:无
*************/
void USARTTask(void * pvParame)
{
char receive_usart;
BaseType_t queue_receive_flag;
while(1)
{
//memset(receive_usart,0,sizeof(usartch));
queue_receive_flag = xQueueReceive(testtask,(void *)&receive_usart,portMAX_DELAY);
if(queue_receive_flag==pdTRUE)
{
printf("消息队列传递的数据为:%c rn",receive_usart);
}
else
printf("error rn");
//memset(usartch,0,sizeof(usartch));
vTaskDelay(10);
}
}
/*************
函数名称:KEYCreatTask
函数功能:创建按键任务,当按键中断来了之后,释放信号量
函数参数:pvParame
函数返回值:无
*************/
void KEYCreatTask(void * pvParame)
{
BaseType_t xReturn =pdPASS;
while(1)
{
if(keyflag ==1)
{
xReturn=xSemaphoreGive(BinarySem_Handle);
if(xReturn == pdTRUE)
{
printf("二值信号量释放成功 rn");
}
// else
// printf("二值信号量释放失败rn");
}
vTaskDelay(20);
}
}
/*************
函数名称:KEY_BeepCreatTask
函数功能:创建按键任务,当按键来了之后,获取信号量进行相应的操作
函数参数:pvParame
函数返回值:无
*************/
void KEY_BeepCreatTask(void * pvParame)
{
BaseType_t xReturn = pdPASS;
while(1)
{
xReturn = xSemaphoreTake(BinarySem_Handle,portMAX_DELAY);
if(pdTRUE == xReturn)
{
printf("二值量获取成功 rn");
beep_con(0);
vTaskDelay(400);
xReturn =pdPASS;
}
vTaskDelay(10);
}
}
/*************
函数名称:Event_Usart_CreatTask
函数功能:创建事件组置位函数任务
函数参数:pvParame
函数返回值:无
*************/
#define Usart_Event1 (0x01<<0)
#define Usart_Event2 (0x01<<1)
TaskHandle_t Event_Usart_CreatHandle = NULL;
void Event_Usart_CreatTask(void * pvParame)
{
while(1)
{
if(usartch=='1')
{
printf("事件1发生!!!rn");
xEventGroupSetBits(Event_Handle,Usart_Event1);
}
if(usartch=='2')
{
printf("事件2发生!!!rn");
xEventGroupSetBits(Event_Handle,Usart_Event2);
}
usartch=0;
//memset(usartch,0,sizeof(usartch));
vTaskDelay(20);
}
}
/*************
函数名称:Event_Usart_WaitTask
函数功能:创建等待事件函数任务
函数参数:pvParame
函数返回值:无
*************/
TaskHandle_t Event_Usart_WaitHandle = NULL;
void Event_Usart_WaitTask(void * pvParame)
{
EventBits_t x_Return;
while(1)
{
x_Return = xEventGroupWaitBits(Event_Handle,Usart_Event1 | Usart_Event2,pdTRUE,pdTRUE,portMAX_DELAY);
if((x_Return & (Usart_Event1|Usart_Event2))==((Usart_Event1|Usart_Event2)))
{
printf("事件1与事件2均发生!rn");
LED2(0);
}
else
printf("事件错误 rn");
vTaskDelay(10);
}
}
/*************
函数名称:TimeTask
函数功能:创建软件定时器回调函数
函数参数:pvParame
函数返回值:无
*************/
uint32_t Timer_Count=0;
uint32_t Systick_Count=0;
void TimeTask(void * pvParame)
{
BaseType_t xReturn =pdTRUE;
Timer_Count++;
printf("回调函数执行 %d 次rn",Timer_Count);
printf("滴答定时器数值为:%drn",Systick_Count);
Systick_Count =xTaskGetTickCount();//获取滴答定时器的计数值
xReturn = xSemaphoreGive(semapphore_Handle);
if(xReturn ==pdTRUE)
{
printf("软件定时器3s已到达,释放一个车位rn");
}
else
printf("软件定时器3s已到达,但无车位可以释放rn");
}
8、FreeRTOS的系统功能
FreeRTOS作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理 、信号量、消息队列、内存管理、记录功能,可基本满足较小系统的需要,FreeRTOS内核支持优先级调度算法,每个任务可根据重要程序的不同被赋予一定的优先级,CPU总是让处于就绪态、优先级最高的任务先运行,FreeRTOS内核同时支持轮换调度算法,系统允许在不同任务使用相同的优先级,在没有最高优先级就绪的情况下,同一优先级的任务共享CPU的使用时间。
FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。
void Bsp_int(void)
{
LED_Config();
beep_config();
key_config1();
usart_config(115200);
//GPIOC->ODR |=(0x01<<5);
}
int main(void)
{
BaseType_t xReturn = pdPASS;
Bsp_int();
xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,"AppTask",512,NULL,1,&AppTaskCreatHandle);//接收串口数据
if(pdPASS == xReturn)
{
vTaskStartScheduler();
}
while(1)
{
}
}
/*************
函数名称:AppTaskCreate
函数功能:创建任务
函数参数:无
函数返回值:无
*************/
TaskHandle_t AppTaskCreatHandle = NULL;
TaskHandle_t LED1TaskCreatHandle = NULL;
TaskHandle_t BeepTaskCreatHandle = NULL;
TaskHandle_t KEYsendCreatHandle = NULL;
TaskHandle_t KEYreceiveCreatHandle = NULL;
SemaphoreHandle_t BinarySem_Handle =NULL;
EventGroupHandle_t Event_Handle =NULL;
TaskHandle_t QueueTask_Handle = NULL;
SemaphoreHandle_t semapphore_Handle=NULL;//计数信号量句柄
TimerHandle_t Time_Handle=NULL;
QueueHandle_t testtask;
#define Queue_Len 1
#define Queue_Size 10
void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();//进入临界区
xReturn = xTaskCreate(LEDTask,"LED1",56,NULL,1,&LED1TaskCreatHandle);
if(xReturn ==pdPASS)
{
printf("LED1任务创建成功rn");
}
//xReturn = xTaskCreate(BeepTask,"Beep",56,NULL,2,&BeepTaskCreatHandle);//创建蜂鸣器任务
testtask=xQueueCreate(Queue_Len,Queue_Size);//创建队列
if(testtask!=NULL)
{
printf("创建队列成功 rn");
vTaskDelay(10);
}
xReturn = xTaskCreate(USARTTask,"USART",200,NULL,9,&QueueTask_Handle);//接收串口数据
BinarySem_Handle=xSemaphoreCreateBinary();//创建信号量
if(BinarySem_Handle!=NULL)
{
printf("信号量创建成功 rn");
}
xReturn = xTaskCreate(KEYCreatTask,"KEYsend",56,NULL,7,&KEYsendCreatHandle);//二值信号量的释放任务
xReturn = xTaskCreate(KEY_BeepCreatTask,"KEYreceive",56,NULL,3,&KEYreceiveCreatHandle);//二值信号量的获取任务
Event_Handle = xEventGroupCreate();
if(Event_Handle!=NULL)
{
printf("创建事件成功 rn");
}
xReturn = xTaskCreate(Event_Usart_CreatTask,"Event_UsartCreat",56,NULL,8,&Event_Usart_CreatHandle);//事件置位
xReturn = xTaskCreate(Event_Usart_WaitTask,"Event_WaitCreat",56,NULL,4,&Event_Usart_WaitHandle);//事件等待
//创建计数信号量
semapphore_Handle =xSemaphoreCreateCounting(5,5);
if(semapphore_Handle!=NULL)
{
printf("计数信号量创建成功rn");
}
//创建软件定时器
Time_Handle =xTimerCreate("TIMER",(TickType_t)3000,pdTRUE,(void *)1,(TimerCallbackFunction_t)TimeTask);
if(Time_Handle!=NULL)
{
printf("创建软件定时器成功rn");
xTimerStart(Time_Handle,0);
}
vTaskDelete(AppTaskCreatHandle);
taskEXIT_CRITICAL();//退出临界区
}
/*************
函数名称:LEDTask
函数功能:创建LED任务
函数参数:pvParame
函数返回值:无
*************/
void LEDTask(void * pvParame)
{
while(1)
{
LED1(1);
vTaskDelay(500);
}
}
/*************
函数名称:BeepTask
函数功能:创建Beep任务
函数参数:pvParame
函数返回值:无
*************/
void BeepTask(void * pvParame)
{
while(1)
{
beep_con(0);
vTaskDelay(400);
}
}
/*************
函数名称:USARTTask
函数功能:创建USART任务
函数参数:pvParame
函数返回值:无
*************/
void USARTTask(void * pvParame)
{
char receive_usart;
BaseType_t queue_receive_flag;
while(1)
{
//memset(receive_usart,0,sizeof(usartch));
queue_receive_flag = xQueueReceive(testtask,(void *)&receive_usart,portMAX_DELAY);
if(queue_receive_flag==pdTRUE)
{
printf("消息队列传递的数据为:%c rn",receive_usart);
}
else
printf("error rn");
//memset(usartch,0,sizeof(usartch));
vTaskDelay(10);
}
}
/*************
函数名称:KEYCreatTask
函数功能:创建按键任务,当按键中断来了之后,释放信号量
函数参数:pvParame
函数返回值:无
*************/
void KEYCreatTask(void * pvParame)
{
BaseType_t xReturn =pdPASS;
while(1)
{
if(keyflag ==1)
{
xReturn=xSemaphoreGive(BinarySem_Handle);
if(xReturn == pdTRUE)
{
printf("二值信号量释放成功 rn");
}
// else
// printf("二值信号量释放失败rn");
}
vTaskDelay(20);
}
}
/*************
函数名称:KEY_BeepCreatTask
函数功能:创建按键任务,当按键来了之后,获取信号量进行相应的操作
函数参数:pvParame
函数返回值:无
*************/
void KEY_BeepCreatTask(void * pvParame)
{
BaseType_t xReturn = pdPASS;
while(1)
{
xReturn = xSemaphoreTake(BinarySem_Handle,portMAX_DELAY);
if(pdTRUE == xReturn)
{
printf("二值量获取成功 rn");
beep_con(0);
vTaskDelay(400);
xReturn =pdPASS;
}
vTaskDelay(10);
}
}
/*************
函数名称:Event_Usart_CreatTask
函数功能:创建事件组置位函数任务
函数参数:pvParame
函数返回值:无
*************/
#define Usart_Event1 (0x01<<0)
#define Usart_Event2 (0x01<<1)
TaskHandle_t Event_Usart_CreatHandle = NULL;
void Event_Usart_CreatTask(void * pvParame)
{
while(1)
{
if(usartch=='1')
{
printf("事件1发生!!!rn");
xEventGroupSetBits(Event_Handle,Usart_Event1);
}
if(usartch=='2')
{
printf("事件2发生!!!rn");
xEventGroupSetBits(Event_Handle,Usart_Event2);
}
usartch=0;
//memset(usartch,0,sizeof(usartch));
vTaskDelay(20);
}
}
/*************
函数名称:Event_Usart_WaitTask
函数功能:创建等待事件函数任务
函数参数:pvParame
函数返回值:无
*************/
TaskHandle_t Event_Usart_WaitHandle = NULL;
void Event_Usart_WaitTask(void * pvParame)
{
EventBits_t x_Return;
while(1)
{
x_Return = xEventGroupWaitBits(Event_Handle,Usart_Event1 | Usart_Event2,pdTRUE,pdTRUE,portMAX_DELAY);
if((x_Return & (Usart_Event1|Usart_Event2))==((Usart_Event1|Usart_Event2)))
{
printf("事件1与事件2均发生!rn");
LED2(0);
}
else
printf("事件错误 rn");
vTaskDelay(10);
}
}
/*************
函数名称:TimeTask
函数功能:创建软件定时器回调函数
函数参数:pvParame
函数返回值:无
*************/
uint32_t Timer_Count=0;
uint32_t Systick_Count=0;
void TimeTask(void * pvParame)
{
BaseType_t xReturn =pdTRUE;
Timer_Count++;
printf("回调函数执行 %d 次rn",Timer_Count);
printf("滴答定时器数值为:%drn",Systick_Count);
Systick_Count =xTaskGetTickCount();//获取滴答定时器的计数值
xReturn = xSemaphoreGive(semapphore_Handle);
if(xReturn ==pdTRUE)
{
printf("软件定时器3s已到达,释放一个车位rn");
}
else
printf("软件定时器3s已到达,但无车位可以释放rn");
}
举报