问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - freeRTOS
  • oo3

    #求助。有没有大佬帮我看看代码要怎么改进, sos

    #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "TIM.h" #include "RS485.h" #include "HCSR04.h" #include "SG90.h" #include "hongwai.h" #include "DHT11.h" #include "FreeRTOS.h" #include "task.h" #include "semphr.h" #include "queue.h" #include //////////////////////////////////////////////////////////////////// // _ooOoo_ // // o8888888o // // 88" . "88 // // (| ^_^ |) // // O\ = /O // // ____/`---'\____ // // .' \\| |// `. // // / \\||| : |||// \ // // / _||||| -:- |||||- \ // // | | \\\ - /// | | // // | \_| ''\---/'' | | // // \ .-\__ `-` ___/-. / // // ___`. .' /--.--\ `. . ___ // // ."" '< `.___\_<|>_/___.' >'"". // // | | : `- \`.;`\ _ /`;.`/ - ` : | | // // \ \ `-. \_ __\ /__ _/ .-` / / // // ========`-.____`-.___\_____/___.-`____.-'======== // // `=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // // 佛祖保佑 永无BUG 永不修改 // //////////////////////////////////////////////////////////////////// extern unsigned int rec_data[4]; // 定义一个二进制信号量 SemaphoreHandle_t xDHT11Semaphore; // Queue for UART data QueueHandle_t uartQueue; //PA1,2,3. PB0,5,6,8,9 //任务函数 void DHT11_Read_Task(void *pvParameters); void DHT11_Process_Task(void *pvParameters); //任务优先级 #define START_TASK_PRIO 1 //任务堆栈大小 #define START_STK_SIZE 128 //任务句柄 TaskHandle_t StartTask_Handler; //任务函数 void start_task(void *pvParameters); //红外感应打开垃圾桶 #define HongWAI_PRIO 4 #define HongWai_SIZE 512 //之前的128貌似太小了,改大之后终于舵机动了 TaskHandle_t HongWaiTask_Handler; void hongwai_task(void *pvParameters); //显示标语任务优先级 #define OLED_TASK_PRIO 1 //任务堆栈大小 #define OLED_STK_SIZE 128 //任务句柄 TaskHandle_t OLEDTask_Handler; //任务函数 void oled_task(void *pvParameters); ////检测距离任务优先级 //#define CEJU_HCSR04_PRIO 1 ////任务堆栈大小 //#define CEJU_HCSR04_SIZE 128 ////任务句柄 //TaskHandle_t CEJUTask_Handler; ////任务函数 //void ceju_task(void *pvParameters); //传输食物发酵温度提示 #define FAJIAO_PRIO 4 #define FAJIAO_SIZE 128 TaskHandle_t FAJIAOTask_Handler; void fajiao_task(void *pvParameters); int main(void) { OLED_Init(); Timer_Init(); Serial_Init(); Servo_Init(); HongWai_Init(); DHT11_Start(); // 创建一个二进制信号量 xDHT11Semaphore = xSemaphoreCreateBinary(); uartQueue = xQueueCreate(10, sizeof(char)); // Queue size of 10 characters if (xDHT11Semaphore == NULL) { // 信号量创建失败的处理 } OLED_ShowChinese(1,1,7); OLED_ShowChinese(1,2,8); OLED_ShowChinese(1,3,0); OLED_ShowChinese(1,4,1); OLED_ShowChinese(1,5,2); OLED_ShowChinese(1,6,3); OLED_ShowString(2,1,"2340711137"); OLED_ShowChinese(3,1,4); OLED_ShowChinese(3,2,5); OLED_ShowChinese(3,3,6); // Servo_SetAngle(0); xTaskCreate(start_task,"start_task",START_STK_SIZE,NULL,START_TASK_PRIO,&StartTask_Handler); // 启动FreeRTOS调度器 vTaskStartScheduler(); // 如果执行到这里,说明内存分配失败,调度器无法启动 while (1){} } void start_task(void *pvParameters) { Serial_Printf("start_task create successful\r\n"); taskENTER_CRITICAL();//进入临界区 if (xTaskCreate(hongwai_task, "hongwai_task", HongWai_SIZE, NULL, HongWAI_PRIO, &HongWaiTask_Handler) != pdPASS) { Serial_Printf("Failed to create HongWai task\r\n"); } if (xTaskCreate(oled_task, "oled_task", OLED_STK_SIZE, NULL, OLED_TASK_PRIO, &OLEDTask_Handler) != pdPASS) { Serial_Printf("Failed to create OLED task\r\n"); } if (xTaskCreate(DHT11_Read_Task, "DHT11_Read_Task", 128, NULL, 2, NULL) != pdPASS) { Serial_Printf("Failed to create DHT11 Read task\r\n"); } if (xTaskCreate(DHT11_Process_Task, "DHT11_Process_Task", 128, NULL, 2, NULL) != pdPASS) { Serial_Printf("Failed to create DHT11 Process task\r\n"); } //如果温度异常,传输食物发酵提示 //xTaskCreate(fajiao_task,"fajiao_task",FAJIAO_SIZE,NULL,FAJIAO_PRIO,&FAJIAOTask_Handler); vTaskDelete(NULL); //删除启动任务自己 taskEXIT_CRITICAL();//退出临界区 } void hongwai_task(void *pvParameters) { UBaseType_t uxHighWaterMark; Serial_Printf("Initial stack high water mark for HongWai task: %lu\r\n", uxHighWaterMark); Serial_Printf("HongWai task initialized\r\n"); uint8_t lastState = read_sensor(); for (;;) { uint8_t currentState = read_sensor(); if (currentState != lastState) { lastState = currentState; if (!currentState) { Servo_SetAngle(75); vTaskDelay(pdMS_TO_TICKS(2000)); } else { Servo_SetAngle(0); } } vTaskDelay(pdMS_TO_TICKS(100)); // 检查并打印当前任务的堆栈使用情况 uxHighWaterMark = uxTaskGetStackHighWaterMark(NULL); Serial_Printf("Current stack high water mark for HongWai task: %lu\r\n", uxHighWaterMark); } } void oled_task(void *pvParameters) { UBaseType_t uxHighWaterMark; Serial_Printf("OLED task initialized\r\n"); uint8_t RxData; // 初始堆栈使用情况 uxHighWaterMark = uxTaskGetStackHighWaterMark(NULL); Serial_Printf("Initial stack high water mark for OLED task: %lu\r\n", uxHighWaterMark); for (;;) { if (Serial_GetRxFlag()) { RxData = Serial_GetRxData(); OLED_ShowHexNum(4, 1, RxData, 8); } vTaskDelay(pdMS_TO_TICKS(500)); // 检查并打印当前任务的堆栈使用情况 uxHighWaterMark = uxTaskGetStackHighWaterMark(NULL); Serial_Printf("Current stack high water mark for OLED task: %lu\r\n", uxHighWaterMark); } } //void fajiao_task(void *pvParameters) //{ // vTaskDelay(pdMS_TO_TICKS(100)); // 延时100ms // Serial_Printf("fajiao_task create successful\r\n"); // vTaskDelay(pdMS_TO_TICKS(100)); // 延时100ms // for(;;){ // DHT11_REC_Data(); //接收温度和湿度的数据 // if(rec_data[2]>20 && rec_data[0]>10){ // vTaskDelay(pdMS_TO_TICKS(100)); // 延时100ms // Serial_SendString("warning\r\n"); // vTaskDelay(pdMS_TO_TICKS(1000)); // 延时100ms // } // else // { // vTaskDelay(pdMS_TO_TICKS(100)); // 延时100ms // Serial_SendString("good\r\n"); // vTaskDelay(pdMS_TO_TICKS(1000)); // } // vTaskDelay(pdMS_TO_TICKS(1000)); // 每2秒检测一次 // } //} void DHT11_Read_Task(void *pvParameters) { for (;;) { DHT11_REC_Data(); Serial_Printf("DHT11 Read Task Started\r\n"); xSemaphoreGive(xDHT11Semaphore); vTaskDelay(pdMS_TO_TICKS(2000)); } } void DHT11_Process_Task(void *pvParameters) { for (;;) { if (xSemaphoreTake(xDHT11Semaphore, pdMS_TO_TICKS(1000)) == pdTRUE) { if (rec_data[2] > 20 && rec_data[0] > 10) { Serial_SendString("warning\r\n"); } else { Serial_SendString("good\r\n"); } } vTaskDelay(pdMS_TO_TICKS(1000)); } } 串口输出的是:start_task create successful Initial stack high water mark for HongWai task: 2779096485 HongWai task initialized DHT11 Read Task Started warning OLED task initialized Initial stack high water mark for OLED task: 56

    单片机 嵌入式 freeRTOS 代码 TE se

    820浏览量 0回复量 关注量
  • 新唐基于ARM的M0和M23的freertos的哪里有参考工程

    如题,在新唐官网上寻找了很多开发板对应的“nucxxxbsp-master\SampleCode\StdDriver”下面比如nuc1263,对应了很多的外设驱动库,但是没有找到移植好的freertos供参考,现在ARM的外设越来越来越多,内存也足够大,功能也日趋复杂,没有rtos有些项目很难开展,请问版主哪里能找到移植好的对应的freertos参考工程或者说明文档?

    m23 ARM 新唐 freeRTOS 移植 NUC

    6517浏览量 7回复量 关注量
  • GD32F407使用freeRTOS死机

    在GD32F407跑了freeRTOS,串口接收使用了DMA+IDLE中断来实现不定长接收,串口的IDLE中断中接收完数据后,通过事件通知线程执行解析,但是中断中调用xEventGroupSetBitsFromISR函数后就会死机

    串口 接收 GD32F407 freeRTOS 使用 国产芯片

    7848浏览量 56回复量 关注量
  • AC78406HGLA,free rtos编译发生错误

    用官方AC78406LGLA freertos例程,工程改芯片型号为AC78406HGLA,编译发生错误 错误如下:#if defined (USING_OS_FREERTOS)#error "Wrong OSIF selected. Please define symbol USING_OS_BAREMETAL (or no OS define) \ in project settings or change the OSIF variant" #endif 为什么改芯片型号就发生这个错误?而且芯片改回去错误还在, 有大佬知道怎么解决吗?非常感谢!!

    Free RTOS 错误 编译 freeRTOS AC78406

    2495浏览量 1回复量 关注量
  • GD32F450使用FreeRTOS配置LVGL心跳,屏幕白了

    void vApplicationTickHook(){ lv_tick_inc(1); } void test(void *pvParameters) { lv_ex_spinner_2(); while (1) { lv_task_handler(); } } 裸机运行正常,看一上午free的操作还是不懂,请教大神如何修改 下载视频

    国产芯片 freeRTOS GD32F450 TI ic TE

    8638浏览量 3回复量 关注量
  • 关于嵌入式操作系统的任务优先级?

    有一个疑问,正在学习使用freeRTOS,两个任务,TaskA优先级高,TaskB优先级低,比如TaskA目前没事可做,延时10ms,TaskB开始执行,执行过程中,TaskA的10ms延时到了,这时候会怎么样?是TaskA等待Task延时或等待,让出执行权,还是不管TaskB执行到什么地方,无条件的切换,开始执行TaskA?因为如果是后者的话,使用模拟总线通信会有问题,时序会被打乱。

    嵌入式操作系统 freeRTOS os 总线通信 通信

    1137浏览量 3回复量 关注量