gpt4 book ai didi

c - 在 RTOS 中安排帧的传输

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:45 24 4
gpt4 key购买 nike

我打算使用我的 STM32板发送CAN帧。我实现了一个包含 10 个任务的简单调度程序;一个任务将负责发送帧。

为了完成这项工作,我为 CAN 帧声明了一个结构:

typedef struct
{
unsigned int id;
unsigned char data[];
unsigned char dlc;
unsigned int timeOfSend //This is the time in ms in which a frame should be sent
}tFrame;

然后我声明了一个要发送的帧表

aubFrames[MAX_FRAMES] = {
{0x12, 0xAABBCC, 4, 100},
{0x12, 0xAABBCC, 4, 1000},
{0x12, 0xAABBCC, 4, 2000},
{0x12, 0xAABBCC, 4, 2010}
};

这告诉开发板在 100 毫秒后发送第一帧,在 1000 毫秒后发送第二帧,依此类推。

我实际上做了什么:

我在调度程序中添加了一个周期为 10 毫秒的新任务。此任务将检查 aubFrames 表,如果到了发送帧的时间,它会发送相关帧,否则什么也不做。这个解决方案的问题是会浪费大量时间。例如,发送第一帧调度程序访问此任务九次,但无事可做。

有没有其他的方案可以让调度更有效?

我想使用定时器中断,但我认为这不是好的解决方案,因为板上只有四个定时器,而帧数超过四个,所以我认为配置定时器以产生中断对于不同的时间段将不起作用。

最佳答案

大多数 RTOS 都有一些看起来很合适的功能。

一种方法是让任务自行暂停适当的时间(而不是定期唤醒以轮询是否到了时间)。例如,FreeRTOSvTaskDelay函数,它在指定的时间内阻止任务。您的任务知道它不必在 100 或 1000 毫秒内执行任何操作,因此它应该自行延迟这段时间。

另一种方法是使用软件定时器而不是硬件定时器。 RTOS 显然已经获得周期性滴答,因为它知道每 10 毫秒唤醒您的任务。它可能还有一个软件定时器服务,如 this one来自 FreeRTOS。软件定时器服务由 RTOS 调度程序使用的硬件定时器驱动。它允许您设置各种周期性和单次软件定时器,而无需另一个硬件定时器。您的任务可以读取 aubFrames 数组并为每个帧设置一个一次性计时器,该计时器会在适当的时间到期。如果您不喜欢所有这些软件计时器同时运行的想法,请在前一个计时器到期的情况下设置下一个计时器。

关于c - 在 RTOS 中安排帧的传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32037577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com