完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
|
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"); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 06:24 , Processed in 0.815057 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号