1.概述
这一块的内容有点晦涩,我也是是搞了很久才搞明白的。所以,从自己搞明白到我决定讲明白也经过了漫长的过程。基于以上的原因我踌躇了很久,这部分的内容讲清楚也是一件具有挑战性的事情。
2.任务
什么是任务?理解这个问题对理解bcos任务切换的原理至关重要。对于一个嵌入式操作系统的使用者理解任务的重点在于任务处理函数,因为任务处理函数是实现任务功能的主体。然而,他们往往忽略了在任务创建之初的他们定义的那个用于任务栈的数组。对于bcos来说,每一个任务都有一片独立的内存空间作为任务执行的栈,对于操作系统开发者而言任务的栈几乎是一个任务的全部。
讲到这里几乎所有读者都还是云里雾里的,对于大多数初学者或者已经工作了好几年的开发者而言,特别是那些更加专注于应用开发的嵌入式开发者,栈在他们的印象中一直都是一个比较模糊的概念。其实,我也是去年(2021年)才在工作中对这个概念逐渐清晰,然而我已经从事C语言编程开发工作3年了,如果从2015年开始算起的话已经有六年之久。过去我印象中的栈只是C语言程序中的一篇内存空间,只知道函数的局部变量会保存在这一片空间中,很长一段时间甚至傻傻的分不清此栈和数据结构课程中学习的栈的区别。既然讲清楚任务切换的原理无法绕开栈这个概念,那我就顺着我的理解过程逐步讲解。
3.从计算机的体系结构讲起
如果有的读者研究过《ARM Cortex-M3权威指南》这本书应该对栈有过深入的了解,我就是从研究这本书开始的。到此,决定从头讲起。话说ARM核内大约有十几二十个寄存器,他们都是32位的寄存器所以STM32是32位的单片机。这些寄存器分别是他们: