我在系统中跑两个线程,钩子函数负责简单的信息打印,打印出来的信息与我想象的不符。
void TASK1(void parameter)
{
/ Filesystem Initialization */
rt_kprintf(“hello world”);
while(1)
{
}
void task2(void* parameter)
{
// rt_thread_delete(init_thread);
//rt_thread_detach(&task1);
while(1)
{
//rt_thread_yield();
//rt_schedule();
rt_kprintf(“————————task2———————
“);
rt_thread_delay(50);
}
}
void idletask()
{
rt_uint16_t i;
while(1)
{
i=50000;
while(—i);
rt_kprintf(“*
“);
}
}
感觉应该没出现5此TASK1 就会有一次TASK2的打印信息,会出现以下状况
\ | /
—————-task1—————
—————-task1—————
—————-task1—————
—————-task1—————
—————-task1—————
————————task2———————
—————-task1—————
—————-task1—————
—————-task1—————
—————-task1—————
—————-task1—————
————————task2———————
—————-task1—————
—————-task1—————
—————-task1—————
——-task1—————
—————-task1—————
—————-task1—————
————————task2———————
—————-task1—————
—————-task1—————
**—————-task1—————
*———task1—————
—————-task1—————
—————-task1—————
————————task2———————
—————-task1—————
—————-task1—————
*—————-task1————— ————task1—————
—————-task1—————
—————-task1—————
————————task2———————
用的是空闲线程的钩子函数
rt_thread_idle_sethook(idletask);
如果只是kprintf被抢占,应该不会影响TASK1 TASK2的间隔关系,既TASK1运行5次,TASK2运行一次,但是打印信息有TASK1运行6此,TASK2运行一次,所以有这样的疑问。
问题已经找到,是kprintf()没有答应完就切换到了 TASK1,这样kprintf()里的缓冲区被填写,底层没有计数,只是判断不为零就一直向外发,所以导致看起来TASK1多运行了一次,其实是kprintf()的bug
问题已经找到,是kprintf()没有答应完就切换到了 TASK1,这样kprintf()里的缓冲区被填写,底层没有计数,只是判断不为零就一直向外发,所以导致看起来TASK1多运行了一次,其实是kprintf()的bug
我上面已经指出了:rt_kprintf是可抢占的,因为当初就是这么设计的。如果需要严格的打印时序,那么就需要把它关中断进行保护。如果默认就关中断保护,那么对于系统的性能会影响很大,所以仅在调试时这么干。