FreeRtos小问题
初步了解FreeRTOS,学习原子哥的视频。
遇到问题总结:
1、freertos的一个“start_task”的子任务是不是同时运行的?
不是,CPU一次只能处理一个任务,之所以会出现同时在运行的现象,是因为,在freertos中出现的延迟与标准库的不一样,这里的延迟是把该任务挂起,从运行态进入就绪态,而在此期间另一个任务会进入运行态,相当于子任务1和子任务2一部分1一部分2的执行。任务是死循环,要想退出或者结束任务可以使用删除任务函数vTaskDelete()。
2、freertos中临界区是什么?为什么在初始化子任务函数时要进入临界区,然后再出去?
每个进程中访问临界资源的那段代码称为临界区(Critical Section) (临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。临界区是提供互斥功能的一种非常原始的实现方法。临界区的工作 仅仅是简单的把中断全部关掉,或者是关掉优先级在configMAX_SYSCALL_INTERRUPT_PRIORITY以下的中断-依赖具体使用的FreeRTOS移植。抢占式的上下文切换只可能在某中断中完成,因此调用taskENTER_CRITICAL()可以在中断关闭的时段一直保持持续运行状态直到退出临界区。在临界区内的函数执行不会被其他东西打断,不过如果用在中断中,要考虑进入临界区的时间,否则就会影响中断运行。
参考博客:https://blog.csdn.net/jdsnpgxj/article/details/110451896
3、任务删除和任务挂起区别?
删除任务时人物的堆栈会被释放掉,任务里面的变量都会丢掉,而挂起不会,挂起的堆栈和任务管理内存都不会被释放,如果再次需要任务的变量时,只需要释放任务就可以。注意,在被挂起后,任务进入挂起态,被释放出来后任务会先进入就绪态,在就绪态里如果它的优先级最高才能直接进入运行态,即在就绪态里还是按照优先级进入运行态。
4、Freertos任务编号怎么去编写的?
在开始创建一个任务时,以Start_task为例,在创建开始后,Start_task任务编号为1,接下来在开启任务调度后即vTaskStartScheduler()后,IDLE即空闲任务会被系统自动创建,编号为2,接着定时器服务任务同样也被系统自动创建,编号为3。空闲任务和定时器服务任务都是系统自动创建的,编号比较靠前,接下来的任务编号就按照用户自己的编译顺序依次进行编号4、5、6等。
5、消息队列的传递方式中,引用传递和值传递的区别?
引用传递,传递的是消息指针,也就是地址,这就意味着消息内容必须一直保持可见性。故局部变量这种随时可能被删掉的东西就不能用来传递消息,不过引用传递比较快很节省时间;值传递,是对数据进行拷贝,这就意味着消息发送到队列中原始数据缓冲区就可以被删除或者改写。因为要拷贝数据故比较费时。不过在FreeRTOS中用值传递,在信息数据太大的情况下,我们可以用引用传递发送消息缓冲区的地址指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)