本文共 1430 字,大约阅读时间需要 4 分钟。
1)我想问一下斑竹,4510在跑ucos时,除了ucos自己的*.c *.s文件以外,是不是要需要另外的bootloader??
也就是说,几乎所有的代码在arm上运行时,都需要有bios??
而不仅仅uclinux需要?不一定都要有BOOTLOADER,需要写一个启动代码,和内核编译在一起就可以了:
编译时应该在放在第一个文件位置编译。启动代码需要完成如下工作:设置 异常向量表,即在 0x0 – 0x1c 位置放置7条跳转指令(其中 0x14 为空)分别实现每种异常的处理程序,其中包括 Reset_Handler、Undefined_Handler、SWI_Handler、Prefetch_Handler、Abort_Handler、IRQ_Handler、FIQ_Handler。程序从 Reset_Handler 进入后,需要首先进行相关硬件的初始化操作,例如 初始化SDRAM、CPU speed、Interrupt Controller、UART、timer 等。建立每种异常状态下的系统堆栈,为了简单起见可以只在 svc 态 和 irq 态下的建立堆栈:setup_svc_stack ,setup_irq_stack。强制 ARM 处理器状态转换为 svc 管理态。跳转到uC/OS-II 代码的 main 入口,实际上是编译链接后产生的 __main 入口。(2)
编译器ADS设置的ro_base是0x0c000000,也就是把ucos所有代码(*.c;*.s)全部编译到以ro_base为起点的空间中了,但是在44b0x中0x0c000000是ram的起始位置,也就是说所有代码编译到ram空间了。刚开机时,pc肯定指向0x0的,所以,程序如何能跳转到ram中的ro_base(0x0c00000)中呢?
我觉得肯定有bootloader在起作用,将执行代码从flash中拷贝到ram中,再设置pc指针为0x0c000000。
0x0c0000中的指令是b ResetHandler应该就是ucos的启动指令了
我编译的这个文件,是要在ram中运行的,所以ro_base才要设置为ram的首地址0x0c000000,只有这样,编译出来的代码才是基于0x0c000000空间之上的。
再者bootloader肯定要起作用,一是拷贝img到ram,二是处理各种中断(3)
现在想把嵌入式操作系统移植进去(例如 UCOS)怎么做?它又没有BIOS,如何把嵌入式操作系统和应用程序都写到存储器上,而且在运行操作系统后马上运行应用程序?莫非可以把操作系统后和应用程序在一起编译后在写入目标机?
(4)
不过我最想确认的还是44b0x跑ucos需要不需要bootloader?
还是直接可以用移植ucos时自带的那个44binit.s就足以?
我个人认为除了上面那个44binit.s之外,还有别的程序在起作用,因为整个ucos系统的文件,包括(*.c,*.s)都在编译连结的时候分配到0xc000000以后的区域。
如果没有别的程序,例如bootloader之类的,那么即使将最终生成的ucos.bin烧到flsah中,也是不能运行的,因为第一条指令是:
b ResetHandler
而ResetHandler是被连接到0xc000000(RAM区域)以后了,此时ram中什么东西也没有,一开始执行就会出错的。
(5)
转载地址:https://blog.csdn.net/silenceee/article/details/1371998 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!