1.uC/OS III 内核, 你应该知道的东西
来源:互联网 发布:淘宝服装推广方案 编辑:程序博客网 时间:2024/05/16 12:54
1<. 进程调度的流程
2<. 临界区的定义
Micrium-uCOS-III-UserManual.pdf
1<. 临界段解释:
就是不可被中断的代码段,例如常见的入栈出栈等操作就不可被中断。uC/OS-II 是一个实时内核,需要关闭中断进入和开中断退出临界段。为此,uC/OS-II 定义了两个宏定义 关中断 OS_ENTER_CRITICAL(); 开中断 OS_EXIT_CRITICAL();
2<. 相关定义:
#define OS_CRITICAL_METHOD 3 //进入临界段的三种模式,一般选择第3 种,即这里设置为3#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} //进入临界段#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} //退出临界段
3<. 更加详细的个人翻译
http://blog.csdn.net/qq_33443989/article/details/77104106 :-)
3<. 位置无关码
http://blog.csdn.net/ustc_dylan/article/details/6965330
1<. 应用程序必须经过编译、汇编和链接后才变成可执行文件
2<. 在链接时,要对所有目标文件进行重定位(relocation),建立符号引用规则,同时为变量、函数等分配运行地址。当程序执行时,系统必须把代码加载到链接时所指定的地址空间,以保证程序在执行过程中对变量、函数等符号的正确引用,使程序正常运行。
3<. 在具有操作系统的系统中,重定位过程由操作系统自动完成。
4<. 在设计 Bootloader 程序时,必须在裸机环境中进行,这时 Bootloader 映像文件的运行地址必须由程序员设定。通常情况下,将 Bootloader 程序下载到 ROM 的 0x0 地址进行启动,而在大多数应用系统中,为了快速启动,首先将 Bootloader 程序拷贝到 SDRAM 中再运行。一般情况下,这两者的地址并不相同。
首先来看下面的链接脚本文件:
ENTRY(_start) ;指定输出可执行文件的起始代码段为_start. SECTIONS { .= BOOTADDR ; bootloader的开始地址 .= ALIGN(4) ; 代码以4字节对齐 .text : ;指定代码段 { cpu/arch/start.o (.text) ; bootloader中的text段 *(.text) ;其它text段 } .= ALIGN(4) .rodata :{*(.rodata)};指定只读数据段 .= ALIGN(4); .data :{*(.data)} ;指定读/写数据段 .= ALIGN(4); __bss_start =. ; 把__bss_start赋值为当前位置,即bss段的开始位置 .bss :{*(.bss)} ; 指定bss段 __bss_end =. ; 把__bss_end赋值为当前位置,即bss段的结束位置 }
需要指出的是,链接脚本中所描述的输出段地址为虚拟地址VMA(VirtualMemoryAddress)。
这里的“虚拟地址”仅指映像文件执行时,各输出段所重定位到相应的存储地址空间,与映像的加载地址无关
因此,上面的链接脚本实际上指定了Bootloader映像在执行时,将被重定位到Bootloader开始的存储地址空间,以保证在相关位置对符号进行正确引用,使程序正常运行。
1<. 没有位置无关码时
假设这里指定 Bootloader = 0x0。以 ARM 为例,ARM 处理器复位后总是从 0x0 地址取第1条指令,因此只需把 Bootloader 设置为0,再把编译后生成的可执行二进制文件下载到 ROM 的 0x0 地址开始的存储空间,程序便可正常引导; 但是,一旦在链接时指定映像文件从 0x0 地址开始,那么 Bootloader 就只能在 0x0 地址开始的 ROM 空间内运行,而无法拷贝到 SDRAM 空间运行实现快速引导。当然,搬运代码最后的跳转语句可以写成绝对地址,如 jmp 0x10000,这样可以正确的跳到 RAM 中的 0x10000 地址处,但当执行继续执行碰到其他符号地址计算,或全局数据访问的时候,由于此时不是位置无关代码,此时地址的计算需要查询 map(地址映射) 表,但是 map 表中的地址仍然在 ROM 空间中,所以还会跳回 ROM 空间,另外,还会有其他问题,如动态内存申请等。
2<. 存在位置无关码时
有了位置无关代码,只需修改链接脚本文件的 Bootloader = 0x10000 即可,即将整个镜像文件都映射到 RAM 空间,但是 bootloader 最开始的搬运代码必须是位置无关的代码,这样虽然搬运代码被映射到 RAM 地址空间,但它在 0x0 开始的 ROM 中也能正确执行,搬运代码最后的跳转语句就可以跳转到某个标号了,因为此时标号的地址已经被映射到了 RAM 空间,之后的代码执行将没有任何问题。 当然,可以将搬运代码和搬运完成跳转到的代码分段映射,即搬运代码映射到 ROM 地址空间,其他代码映射到 RAM 空间。但是这样会存在一个问题:生成的 bin 文件变得非常大。生成的 bin 文件将会按照映射到地址空间来生成,如果 ROM 空间与 RAM 空间地址不连续,假设ROM地址空间为 0x0 ~ 0x1000 , RAM 地址空间为 0x10000~0x20000,那么, 0x1000~0x10000 之间的地址空间都被填充为 0,除非在生成 bin 文件时重新进行拼装。
3<. 如何编写位置无关代码呢?
引用同一位置无关段或相对位置固定的另一位置无关段中的符号时,必须是基于PC的符号引用,即使用相对于当前PC的偏移量来实现跳转或进行常量访问。
1<. 位置无关的程序跳转。
使用相对跳转指令实现程序跳转。指令中所跳转的目标地址用基于当前PC的偏移量来表示,与链接时分配给地址标号的绝对地址值无关,因而代码可以在任何位置进行跳转,实现位置无关性。2.位置无关的常量访问。
在应用程序中,经常要读写相关寄存器以完成必要的硬件初始化。为增强程序的可读性,利用EQU伪指令对一些常量进行赋值,但在访问过程中,必须实现位置无关性。3<. 使用绝对地址进行跳转,一般是在不同的位置无关代码段之间跳转。
最后,总结一下位置无关代码段的优点:
- 简化设计,方便实现系统的快速引导。
位置无关代码可以避免在引导时进行地址映射,并方便地跳转到 RAM 中实现快速引导 - 实现复位处理智能化。位置无关的代码可以被加载到任意地址空间运行
- 便于调试。Bootloader 的调试通常也是一个繁琐的过程,使用位置无关代码,则可以将映像文件加载到 RAM 中进行调试,这既能真实地反映程序从 ROM 中 进行系统引导的情况,又可以避免频繁烧写程序存储器。
4<. 对齐的意义
5<. 大小端的概念
- 1.uC/OS III 内核, 你应该知道的东西
- 1.什么是uC/OS III,以及uC/OS III的结构
- uC/OS-III 的特点
- iOS你应该知道的一些东西
- 关于NODE_ENV!你应该知道的东西
- uC/OS-III的任务管理
- uC/OS-III Note
- java规则引擎你应该知道的几点东西
- 关于CPU节能模式你应该知道的东西
- 关于ISO七层模型你应该知道的东西
- uC/OS-III系统内核学习--OSTaskChangePrio函数
- uC/OS-III之等待多个内核对象
- 2.uC/OS III 内核, 关于临界段
- 基于STM32的uC/OS-III 初学(1) - uC/OS-III介绍和下载
- 大学生应该知道的东西
- 研究生应该知道的东西!
- 你知道的东西
- uC/OS-III学习1::uC/OS-III介绍
- 'sessionFactory' or 'hibernateTemplate' is required
- 第二章-理解面向对象
- 剑指offer:把数组排成最小的数
- Windows如何搭建PHP开发环境?
- java 使用redis
- 1.uC/OS III 内核, 你应该知道的东西
- 感知机
- C#中out和ref之间的区别
- Android将camera获取到的YuvData在jni中转化为Mat
- basemap构建地图
- protobuf
- 每日一题——判断二叉树是否平衡,求一棵二叉树的镜像
- 方法内部类
- 小结 | 函数的调用过程(栈帧)