网站设计公司深圳缩我短网址生成
news/
2025/10/5 17:59:48/
文章来源:
网站设计公司深圳,缩我短网址生成,wordpress如何添加内链,装修网名字大全1.开发背景 基于以上的章节#xff0c;了解了 FreeRTOS 多线程间的信号量、队列的使用#xff0c;已经满足了日常使用场景。其中#xff0c;队列的使用规定了队伍成员的大小#xff0c;然而现实使用场景下#xff0c;很多数据不都是定长大小了#xff0c;例如不定长的通讯…1.开发背景 基于以上的章节了解了 FreeRTOS 多线程间的信号量、队列的使用已经满足了日常使用场景。其中队列的使用规定了队伍成员的大小然而现实使用场景下很多数据不都是定长大小了例如不定长的通讯协议亦或者是缓存日志信息如果在这种场景下使用队列传递信息显然不合适会导致队伍中空间没有利用起来。因此FreeRTOS 引入流缓冲区实际上就是环形缓存。 注意流缓冲区相对于队列没有设置临界区保护只有一对一传输才是安全的一对多或者多对多需要自行进入临界区保护。
2.开发需求 设计实验 1创建 2 个线程控制线程和接收线程 2控制线程定时发送数据到流缓存区 3接收线程接收流缓存区的数据
3.开发环境 window10 MDK STM32F429 FreeRTOS10.3.1
4.实现步骤
4.1 实现编码 创建流缓存区还需要注意的是触发的字节数 xTriggerLevelBytes接收数据的时候需要达到触发字节数才会触发接收一般设置为 1 即可。
#include appTest.h#include stdio.h
#include string.h
#include stdlib.h#include mspDwt.h
#include mspGpio.h
#include mspExti.h#include FreeRTOS.h
#include task.h
#include queue.h
#include stream_buffer.h#include appLog.htypedef struct
{/* 流缓存区 */unsigned char rxBuff[1024];StreamBufferHandle_t buffer;/* 创建任务 */TaskHandle_t taskCtrl;TaskHandle_t taskRx; }Ctrl_t;/* 文件指针 */
static Ctrl_t s_ctrl {0};
static Ctrl_t *p s_ctrl;
static void TaskCtrl(void *pvParameters);
static void TaskRx(void *pvParameters);static void TaskCtrl(void *pvParameters)
{for ( ; ; ){static unsigned char count 0;vTaskDelay(10);if (count 10){xStreamBufferSend(p-buffer, count, sizeof(count), portMAX_DELAY);Log_Debug(%s Tx Data %d\r\n, __func__, count);count;}}
}/* 接收线程 */
static void TaskRx(void *pvParameters)
{for ( ; ; ){size_t rxSize xStreamBufferReceive(p-buffer, p-rxBuff, 100, portMAX_DELAY);Log_Debug(%s RxData , __func__);for (int i 0; i rxSize; i){Log(eLog_Debug, %.2X , p-rxBuff[i]);}Log(eLog_Debug, \r\n);}
}/* 测试初始化 */
void aTest_Init(void)
{/* 创建流缓冲区 */size_t xBufferSizeBytes 100;size_t xTriggerLevelBytes 1; // 接收的字节大于触发字节可以提前唤醒p-buffer xStreamBufferCreate(xBufferSizeBytes, xTriggerLevelBytes);/* 创建动态任务 */xTaskCreate(TaskCtrl, TaskCtrl, 500, NULL, 4, p-taskCtrl);xTaskCreate(TaskRx, TaskRx, 500, NULL, 4, p-taskRx);
}/* Key2 PC13 Key0 PH3 Key1 PH2 */
void Exti13_TriggerInterrupt(void)
{mspExti_Close(13);if (mspGpio_GetInput(PC13) 0){}
}4.2 结果显示 4.3 其他常用接口
xStreamBufferIsEmpty // 判断缓存是否空
xStreamBufferIsFull // 判断缓存是否满
xStreamBufferReset // 缓存复位清空
xStreamBufferBytesAvailable // 缓存现有已存储字节
xStreamBufferSpacesAvailable // 混存现有未储存字节
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928554.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!