关于ucos问题
发布日期:2021-10-16 00:21:27 浏览次数:2 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:uC/OS-II 应用程序基本结构
下一篇:FIR的阶数,矩形窗的长度

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月05日 07时59分09秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章