完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
你们1个tick所需的时间是10ms, 如果我要在一个线程中sleep几个ms(少于10ms), 让其他优先级较低的线程运行,应该要这么做?
首先你们说“请勿修改 FreeRTOSConfig.h,改动并不会影响底层运行,无法生效。” 因此在FreeRTOSConfig.h中"#define configTICK_RATE_HZ ( ( portTickType ) 100 )"这个无法修改。那是要用vTaskDelayUntil的这个API,还是用其他的方法呢?(请不要提供不靠谱的方法 ) |
|
相关推荐
1个回答
|
|
|
在FreeRTOS中,`vTaskDelay`函数用于让当前任务延迟指定的tick数。由于你提到在1.3版本的RTOS-SDK中,一个tick的时间是10ms,如果你需要让任务延迟少于10ms的时间,使用`vTaskDelay`可能不是最佳选择,因为它的最小延迟时间是10ms。
你可以考虑以下几种方法来实现你的需求: 1. **使用`vTaskDelayUntil`**: `vTaskDelayUntil`函数允许你指定一个绝对时间,而不是相对时间。你可以使用这个函数来实现更精确的延迟。首先,你需要获取当前的时间,然后加上你希望延迟的时间(以tick为单位),最后调用`vTaskDelayUntil`。 ```c TickType_t xLastWakeTime; const TickType_t xFrequency = 1; // 1 tick的频率,即10ms // 获取当前时间 xLastWakeTime = xTaskGetTickCount(); // 计算延迟时间 TickType_t xDelayTime = (xFrequency * 10) / portTICK_PERIOD_MS; // 延迟10ms // 调用vTaskDelayUntil vTaskDelayUntil(&xLastWakeTime, xDelayTime); ``` 2. **使用`xTaskNotifyWait`**: 如果你希望在某个事件发生时唤醒任务,可以使用`xTaskNotifyWait`。这种方法允许你在事件发生时立即唤醒任务,而不是等待固定的时间。 ```c BaseType_t xReturn; uint32_t ulNotificationValue; // 等待通知 xReturn = xTaskNotifyWait(0, 0, &ulNotificationValue, 10 / portTICK_PERIOD_MS); if (xReturn == pdPASS) { // 处理通知 } ``` 3. **使用`vTaskSuspend`和`vTaskResume`**: 如果你希望在特定条件下让任务暂停,可以使用`vTaskSuspend`和`vTaskResume`。这种方法允许你在满足条件时立即恢复任务的执行。 ```c // 暂停任务 vTaskSuspend(xTaskToSuspend); // ... 执行其他任务 ... // 恢复任务 vTaskResume(xTaskToSuspend); ``` 4. **使用定时器**: 另一种方法是使用FreeRTOS的定时器功能。你可以创建一个定时器,当定时器到期时,它会调用一个回调函数来处理你的任务。这种方法允许你在定时器到期时立即唤醒任务。 ```c TimerHandle_t xTimer; StaticTimer_t xTimerBuffer; void vTimerCallback(TimerHandle_t pxTimer) { // 处理定时器到期事件 } // 创建定时器 xTimer = xTimerCreateStatic("Timer", 10 / portTICK_PERIOD_MS, pdFALSE, NULL, vTimerCallback, &xTimerBuffer); // 启动定时器 xTimerStart(xTimer, 0); ``` 总之,你可以根据你的具体需求选择合适的方法来实现任务的延迟或唤醒。在这些方法中,`vTaskDelayUntil`和`xTaskNotifyWait`可能更适合你的需求,因为它们可以实现更精确的延迟和事件驱动的唤醒。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
448 浏览 0 评论
971 浏览 0 评论
1695 浏览 0 评论
请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
1349 浏览 1 评论
1246 浏览 1 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
1270浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
936浏览 3评论
2368浏览 3评论
ESP-IDF的VScode插件的build按钮点击会报错的原因?
2555浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
1063浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-8 09:50 , Processed in 2.679886 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
358
