硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1439|回复: 4
收起左侧

[FreeRTOS] 学习FreeRTOS的一些疑问

[复制链接]

38

主题

75

回帖

189

积分

初级会员

积分
189
发表于 2024-6-15 07:59:03 | 显示全部楼层 |阅读模式



初学者,有很多地方似懂非懂:
1,FreeRTOS的每个任务都是while(1)这种死循环,我有点想不通,任务是怎么切换的?就是怎么退出去的?因为按照我之前裸机开发仅有的知识点,退出死循环不是要有break, return这种吗?我没有看到while(1)有break,或return这种退出语句啊?实在不懂他是怎么退出的?

2,我有任务A和任务B两个任务,任务A有a, b, c三行代码,任务B也有d,e,f三行代码,假设任务A优先级最高,FreeRTOS的任务调度是先把a,b,c按顺序执行完阻塞退出,在按顺序执行任务B,还是先执行a, 然后执行d,再执行b,,,,类似这种交叉执行?

3,假设有个任务如下

void  task1(void *pvParameters)
{

      while(1)
      {
             for(unsigned char i=0; i<10; i++)
             {
                     getvalue= sensor_calc1 + sensor_calc2;  //计算得到getvalue的值----------------1
                     xSemaphoreGive(xBinarySemaphore);   //得到getvalue值后释放一个信号量通知任务task2-------------2
                     
                     read_sensor += 1;   //-----------------------------3
             }                        
      }
}



void  task2(void *pvParameters)
{


       while(1)
      {
            xSemaphoreTake(xBinarySemaphore, portMAX_DELAY);
      }

}


我的疑问,
task1中,代码1,2,3都在for循环中,如果代码2释放了信号量,此时是立即切换到task2, 还是会把后面的代码3执行完呢?还是说先不管这个信号量,直接完整的循环十次结束循环?
也就是这个for循环是每循环一次就释放一次信号量,然后立即切换到task2?


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-6-15 09:15:04 | 显示全部楼层
楼主方便的时候,把这期视频学习下,任何RTOS都适用。

第6期ThreadX视频教程:图文并茂吃透RTOS运行机制,任务管理,上下文切换,任务栈,系统栈等(2023-02-19)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=118041


看完后,再回过头来看问题,就很好理解了
回复

使用道具 举报

38

主题

75

回帖

189

积分

初级会员

积分
189
 楼主| 发表于 2024-6-15 14:33:15 | 显示全部楼层
eric2013 发表于 2024-6-15 09:15
楼主方便的时候,把这期视频学习下,任何RTOS都适用。

第6期ThreadX视频教程:图文并茂吃透RTOS运行机制 ...

好的,感谢大佬~~~~~~
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-6-17 09:49:56 | 显示全部楼层
不同的任务有不同的执行区(堆栈),发生systick中断时,OS先将该任务堆栈就绪,然后再跳该到该任务执行。
回复

使用道具 举报

38

主题

75

回帖

189

积分

初级会员

积分
189
 楼主| 发表于 2024-6-18 11:19:07 | 显示全部楼层
fxyc87 发表于 2024-6-17 09:49
不同的任务有不同的执行区(堆栈),发生systick中断时,OS先将该任务堆栈就绪,然后再跳该到该任务执行。

所以你意思是从底层切换的?因为按照我们写程序人的思维,while(1)这种死循环,没有break或return, 是不可可能跳出来的,现在他没有使用break和return也跳出来了,所以不太明白,猜想可能涉及到了底层一些栈指针的操作,逃过了while(1)的限制
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:40 , Processed in 0.037763 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表