成都网站开发的公司,wordpress优秀案例,营销型网站建设 案例,深圳国内网站设计公司任务
创建好任务#xff0c;不管是动态还是静态创建#xff0c;任务的状态是init #xff0c;通过start方法来启动任务#xff1b;线程大小 设置小了#xff0c;无法正常工作#xff1f;显示占空间100%
启动过程
TODO 这是编译器特性#xff1f;
因为RT-Thread使用编…任务
创建好任务不管是动态还是静态创建任务的状态是init 通过start方法来启动任务线程大小 设置小了无法正常工作显示占空间100%
启动过程
TODO 这是编译器特性
因为RT-Thread使用编译器这里仅讲解KEILIAR或 者GCC稍微有点区别但是原理是一样的自带的$Sub$$和$Super$$这两个符号来扩展了main函数使 用$Sub$$main可以在执行main之前先执行$Sub$$main在$Sub$$main函数中我们可以先执行一些预操作RT-Thread通过扩展main函数的方式都在component.c 里面实现了硬件初始化系统初始化
启动过程中函数sub and super - CC-ARM编译器的特性 S u b Sub Sub$ 与 S u p e r Super Super$ 的“补丁”功能(_CC_ARM编译器环境)
extern void ExtraFunc(void); /* 用户自己实现的外部函数*/void $Sub$$function(void)
{ExtraFunc(); /* 做一些其它的设置工作 */$Super$$function(); /* 回到原始的function函数 */
}/* 在执行function函数执行会先执行function的扩展函数$Sub$$function在扩展函数里面执行一些扩展的操作
当扩展操作完成后最后必须调用$Super$$function函数通过它回到我们原始的function函数 */
void function(void)
{/* 函数实体 */
}main 是初始线程-main_thread_entry【main d的 while 需要吗】
在这个初始线程里面创建各 种应用线程当所有应用线程都成功创建好后初始线程就把自己关闭。那么这个初 始线程就在rt_application_init()里面创建
注意他的优先级 是 最大/3 TODO 等下测试下打印线程列表 在原有 main 函数中的while循环 还需要吗一般不需要没事做就不需要 只有在不写成while时 才会退出该线程 【解释了一个现象这种写法是错误的强制占用该线程导致所有优先级比 main_thread低的都无法执行main 的优先级是 max/3】
main{
while(1){
//什么也没有
}
}初始化内核
板级硬件初始化定时器初始化-线程调度器初始化-任务模块信号量初始化空闲线程
线程设计
中断函数 不能使用挂起当前线程的操作不允许调用任何会阻塞运行的API函数接口空闲线程是唯一不允许出现阻塞情况的线程一般来说处理时间更短的线程优先级应设置更高一些。
执行时间
线程的执行时间一般是指两个方面一是线程从开始到结束的时间-线程本身运行的时长二是线程的周期-响应时间。 一般来说处理时间更短的线程优先级应设置更高一些因为即时低优先级被抢占也花费不了多少时间
在系统设计的时候这两个时间候我们都需要考虑例如对于事件A对应的服务线程Ta系统要求的实时响应指标是10ms而Ta的最大运行时间 是1ms那么10ms就是线程Ta的周期了1ms则是线程的运行时间简单来说线程Ta在10ms内完成对事件A的响应即可。此时系统中还存在着 以50ms为周期的另一线程Tb它每次运行的最大时间长度是100us。在这种情况下即使把线程Tb的优先级抬到比Ta更高的位置对系统的实 时性指标也没什么影响因为即使在Ta的运行过程中Tb抢占了Ta的资源等到Tb执行完毕消耗的时间也只不过是100us还是在事件A规定 的响应时间内(10ms)Ta能够安全完成对事件A的响应。但是假如系统中还存在线程Tc其运行时间为20ms假如将Tc的优先级设置比Ta更高 那么在Ta运行的时候突然间被Tc打断等到Tc执行完毕那Ta已经错过对事件A10ms的响应了这是不允许的。所以在我们设计的时候 必须考虑线程的时间一般来说处理时间更短的线程优先级应设置更高一些。参考资料
内核移植 cortex-M
上下文切换 中断开关
接口-全局中断开关
PRIMASK 寄存器只有一位屏蔽所有的可屏蔽中断
任务栈的初始化
cortex-m3的核心寄存器
主堆栈指针MSP进程堆栈指针PSP R13在任何时刻只能是其中一个默认情况为MSP可以通过控制寄存器CONTORL来改变。
一般情况下没有必要使用PSP除非是有os存在时MSP用于os内核的sp而PSP用于thread级app的sp这两个sp需严格分开。
LR 返回的地址
PC 当前运行地址 其他
create and init
创建- 动态创建对象 动态的内存从无到有 初始化-静态创建对象本来就有静态的数据