标签:
我的基础:能在现有C程序下做些修改,不会移植,不会写驱动,很难从头到尾自己写程序。
RT-thread基础:之前看了一点rtthread_manual.zh.pdf(即RT-thread使用手册),发现挺难看懂的,只了解了一些基础知识,比如线程调度大概的意思。决定还是直接看程序吧,又不懂的再回去看手册。
1.使用的是RT-thread1.2.1版本,打开程序发现工程目录下有很多组,先不去管它,直接看Applications组,里面有两个.c文件,分别是application.c和startup.c。
初步判断startup.c的作用是系统的初始化和启动,而application.c的作用是实现用户具体的功能要求。
2.进入startup.c文件,包含三个头文件,两个子函数和一个main函数。
int main(void)
{
/* disable interrupt first */
rt_hw_interrupt_disable();
/* startup RT-Thread RTOS */
rtthread_startup();
return 0;
}
3.关于rt_hw_interrupt_disable();
F12 rt_hw_interrupt_disable();追踪不过去,于是用find in files追踪到context_rvds.S文件有这么一段
;/*
; * rt_base_t rt_hw_interrupt_disable();
; */
rt_hw_interrupt_disable PROC
EXPORT rt_hw_interrupt_disable
MRS r0, PRIMASK
CPSID I
BX LR
ENDP
经查①PROC和ENDP是一起使用过的,表示一段子程序。
②EXPORT ,表示本程序里面用到的变量提供给其他模块调用的。IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的。
③MRS:Move to Register from State register 将状态寄存器的内容传送至通用寄存器。MSR:Move to State register from Register将通用寄存器的内容传送至状态寄存器。
④"cpsid i"对于Cortex-M3来说是关闭中断的汇编指令,可以看看《Cortex-m3权威指南》
⑤bx lr的作用等同于mov pc,lr 即跳转到lr中存放的地址处。那么lr存放的是什么地址呢?lr就是连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行。当通过BL或BLX指令调用子程序时,硬件自动将子程序返回地址保存在R14寄存器中。在子程序返回时,把LR的值复制到程序计数器PC即可实现子程序返回。
总而言之,rt_hw_interrupt_disable();就是关全局中断用的,可以不去深究。至于为什么要在程序一开始就关全局中断呢,是因为想先初始化完成,初始化都没完成就引起中断可能会造成错误,姑且这么想。
2015-07-20
标签:
原文地址:http://www.cnblogs.com/xye2015/p/4661411.html