要做到这些测试, 得进行以下的这些验证项目(所有的操作都可以看 u-boot 的源代码 start.S 文件, 不同的平台可能不同, 但是意思差巴多):
1. CPU 寄存器操作测试. (参考这篇)
2. stack pointer (SP)的设定是否正确, function call 是否可正常运行.
3. 中断向量表设定是否正确, 中断向量程序是否可正确运行.
4. 内存初始化及其操作测试, 要保证所有的内存都可正常读/写(如果可以写入的话).
5. 将 data 段加载 RAM, 对 BSS(Block Started by Symbol) 段设定初值(全部置零), 如果有程序段必须在 ROM 意外的内存执行的话, boot loader 也要负责将其加载. 在此阶段, 我们必须保证当主程序执行起来后, 程序中全局变量的初始值都是正确的; 如果有需要被加载的程序段(注: *), 也必须确认其可正确执行.
只有做好了这些测试后, 才能将板子分配各团队的其他同仁继续开发, 不然把状况不明或不稳定的板子发布, 只会制造团队的纠纷, 浪费大家时间.
.........................................................................................................................................................................
注解: 有时我们需要把某些模块的性能改善, 一个可行的办法就是让其在速度较快的 RAM 中执行, 在执行之前必须将其从 ROM 中加载到 RAM 里. 方法就是改写 link script(关于链接脚本, 可参考相关文档). 下面只是个例子, 不同的平台环境写法不同, 咱不纠结在这, 重要的流程差不多, 意思也类似.
/* speed_up 模块的 VMA 和 LMA 都是跟在 data 段之后
* speed_up 模块会被加到执行文件中, 但执行时期要载到 RAM 才能运行.
*/
.text_speed_up__END_data: AT(__START_data_LMA + SIZEOF(.data))
{
_START_text_speed_up = .; // '.' 号表示当前的 VMA.
Speed_up_main.o(.text);
Speed_up_main.o(.rodata);
Speed_up_main.o(.data);
_END_text_speed_up = .;
/* 图方便, 假设, 这个模块没有 bss 段 */
}
_START_text_speed_up_lma = LOADADDR(.text_speed_up);
_SIZE_TEXT_SPEED_UP = _END_text_speed_up - _START_text_speed_up;
==============================================================================================================================