- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 freeRTOS 在 CC3200 wifi (TI) lauchpad 板上构建一个具有多个任务的系统。我在我的 main 中创建了三个任务:
// Create task1
osi_TaskCreate( task1, ( signed portCHAR * ) "task1",
OSI_STACK_SIZE, NULL, 1, NULL );
//Two more tasks
所有三个任务都具有相同的优先级 (1),因此我希望所有三个任务都将获得相同的处理器时间。
每个任务只负责在uart端口上打印它的名字:
void task1( void *pvParameters )
{
while(1)
{
Report("task1");
}
}
不幸的是,我一直只看到任务 1 打印它的名称。我应该怎么做才能解决这个问题?
最佳答案
就我对 FreeRTOS 的内存而言,如果您确实以相同的优先级创建所有线程,那么您只有在不定义 USE_TIME_SLICING 或定义它并将其设置为“1”时才能获得您想要的平等共享'.
当多个线程竞争访问硬件资源(或共享内存资源)时,您总是希望以某种方式控制对其的访问。在这种情况下,最简单(虽然不是最快)的选择是使用互斥体,FreeRTOS 也有二进制信号量,它可以完成相同的事情并且可能会稍微快一些。一般来说,互斥体和二进制信号量是可以互换的。对于这两个的详细信息,我会去阅读有关它们的 FreeRTOS 文档,它应该会澄清问题。
如果您原谅伪代码,您希望每个线程都按照以下方式执行操作
createMutex(UART_Lock)
void task1
{
while(1)
{
if(GetLockOnMutex(UART_Lock))
{
PrintToUART();
ReleaseMutex();
}
}
}
void task2
{
while(1)
{
if(GetLockOnMutex(UART_Lock))
{
PrintToUART();
ReleaseMutex();
}
}
}
void task3
{
while(1)
{
if(GetLockOnMutex(UART_Lock))
{
PrintToUART();
ReleaseMutex();
}
}
}
因此,当每个线程进入上下文时,它将尝试获取互斥体上的锁,该互斥体用于限制对 UART 的访问。如果成功,它将发送一些内容,并且只有当打印函数返回(可能跨越多个时间片)时,它才会释放 UART 上的锁,以供另一个线程尝试获取。如果线程无法获得锁,那么它只会再次尝试,直到时间片结束。您可能有一个无法获得锁的线程将自己重新休眠,直到它下次进入上下文,但只有当您的 CPU 非常繁忙并且您必须考虑您的任务是否实际上是可调度的时,这才真正重要。
基本上,如果您不控制对 UART 的访问,并且无法保证线程在给定时间片内完成对 UART 的访问,那么调度程序可以抢占未完成的线程,而其他线程可以尝试使用 UART。
假设 UART 发送缓冲区可能会在您的情况下解决它,这是合乎逻辑的,但您真的不想依赖它,因为它只有那么大,而且没有什么可以阻止一个线程完全填满它。
关于c - CC3200 Launchpad 上的 FreeRTOS 无需进行调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27172015/
我正在使用 http://www.freertos.org/对于应用程序,但我找不到自启动以来如何获取系统时间。我可以创建一个任务并不断更新计数器,但我认为这不是一件好事,因为调度程序可能会安排我的任
我正在开始使用 freeRTOS。我浏览了 freeRTOS.org 中提供的文档,并对一些演示项目进行了一些练习。我的问题是如何在不使用 win32 端口的情况下安装 freeRTOS(因为它只是一
我正在开始使用 freeRTOS。我浏览了 freeRTOS.org 中提供的文档,并对一些演示项目进行了一些练习。我的问题是如何在不使用 win32 端口的情况下安装 freeRTOS(因为它只是一
当使用依赖于 WFI 指令的无滴答空闲功能时,我在 FreeRTOS 的 Cortex-M 端口中看到以下几行 __asm volatile( "dsb" ); __asm volatile( "wf
我在 Linux 下使用 C 编写了一个应用程序,其中使用自定义结构创建队列。代码运行得很好。现在我想修改该代码以使用 freeRTOS 运行它。这是我第一次接触 RTO。在浏览文档时,我发现 fre
哪些参数定义了 FreeRTOS 中的时间片持续时间,以及如何计算在切换一个任务并切换到另一个任务之前它将运行多长时间。 我找到了 configTICK_RATE_HZ,它设置了每秒的滴答数,但它与任
我开始使用 FreeRTOS,我想要一个中断来抢占任何即将运行的任务并运行我需要关键运行的任务。 有没有办法在 FreeRTOS 中执行此操作? (这是通过任务优先级实现的吗?) 最佳答案 不!以上两
我有 STM32F746ZG Nucleo-144pin 板并使用 STMCubeMx 生成代码。我选择了CubeMx提供的10.0.0版本的FreeRTOS,工具链是SW4STM32。 我做了两个任
我正在学习 freeRTOS。我需要在 PIC32 平台(cerebot Mx7ck)的 freeRTOS 中编写软件中断 ISR 处理程序。我浏览了文档,但没有帮助。请有人帮忙。 最佳答案 您是在寻
FreeRTOS 使用什么样的调度程序? 我在某处读到它是一个运行完成调度程序,但另一方面,我也看到它与并行任务一起使用,所以它不会是一个循环调度程序? 最佳答案 最高优先级的任务被授予CPU时间。如
FreeRTOS 使用什么样的调度程序? 我在某处读到它是一个运行完成调度程序,但另一方面,我也看到它与并行任务一起使用,所以它不会是一个循环调度程序? 最佳答案 最高优先级的任务被授予CPU时间。如
我正在构建一个 FreeRTOS 应用程序。我创建了一个模块,它从另一个模块注册 freeRTOS 队列句柄,当该模块中发生中断时,它会向所有注册的队列发送一条消息。但似乎我能够从队列发送消息,但无法
在 cortex M0 MCU 上的一些 FreeRTOS 演示中 configMINIMAL_STACK_SIZE设置为 60,而其他一些设置为 70。使用 STM32Cube 软件将其设置为 12
我想创建两个在 FreeRTOS 中同时运行的任务。第一个任务将处理 LED,第二个任务将监视温度。我有两个问题: 这段代码会创建两个同时运行的任务吗? 如何在任务之间发送数据,例如:如果温度超过 x
我正在读取 dsPIC30F6014A 上 ADC channel 上的一些数据。为此,我为每个 ADC 实现了一个单独的任务(例如 7 个 channel -7 个任务)。 我只在开始时创建了所有任
我写了一个简单的例子,包括 2 个任务:任务 1 和任务 2。任务 1 的优先级高于任务 2。在任务 1 函数中,我增加了任务 2 的优先级,使其优先级等于 (任务 1 的优先级 + 1)。此外,在任
我有一个任务在 freeRTOS 上运行,我正在检查该应用程序中有多少应用程序堆栈未使用。我看到的是,可用堆栈内存在一段时间后会减少,并在很长一段时间内保持在该值。该任务有一个 while(1) 循环
让一个线程修改原子单元(例如字符)而另一个线程仅读取它是否安全?当然,在允许这样做的环境中,例如 freertos。 我得到了一些执行此操作的代码,它使用 bool (定义为 char)作为信号量,我
我正在使用 ARM Cortex-M4 微 Controller 来开发带有 FreeRTOS 的应用程序。 为了精确计时,我想使用基于中断的计时器。中断具有适当的优先级,因此它应该能够调用 Free
我是 FreeRTOS (ARM CM3) 的初学者,我的问题是: 当你创建一个内部有一些局部变量的任务时,将这些变量存储在 RAM 中,堆栈中(由 main() 使用)就像局部变量的一般情况一样,或
我是一名优秀的程序员,十分优秀!