完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本人总结了关于ti DSP的boot原理,格式,以及参考代码供大家参考。不足之处,敬请指正。
2014.12.8: 更新:改成CCSV5.5工程,内容稍做修改与简化。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
相关推荐
100个回答
|
|
http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
Hi Tony,不好意思,有个boot的新问题:
连仿真器后先load load原始的OMAPL138DemoInterrupt.out文件通过CCS run,LED如预期闪烁。 然后我通过自己写的UBL程序将OMAPL138DemoInterrupt的二进制代码烧进FLASH后再读出来运行失败(LED没动静),load symbols也停不到任何代码行处。 不断开仿真器再load原始的OMAPL138DemoInterrupt.out文件,单步运行发现会在_call_swi(327680);处跑飞再也执行不下去—— 为什么会这样? 断点重连仿真器后先操作原始工程又OK,接着弄UBL后又跑飞。 |
|
|
|
fstdftwew 发表于 2018-6-21 21:31 _call_swi(327680); 这个函数是进入SWI模式,传递的参数是327680,这个参数没有特殊的意义,仅仅是自己定义用来在SWI ISR区分想要进入的处理分支。 调用这个函数出问题,在于你的程序里有没有SWI exception的处理代码实现。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
fstdftwew 发表于 2018-6-21 21:31 Jingang Yang 对了,看一下这篇贴子的总结: http://www.deyisupport.com/question_answer/dsp_arm/omap_l1x/f/54/t/103692.aspx http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
lifei639156 发表于 2018-6-21 21:44 Tony, 关于327680这个数值的意义我已了解,但我不解的是,我用的是你附件里的例程,按理说你例程里SWI的SWI Handler是有的——在handler.asm中。 为什么这个工程单独下载.out运行OK,但转成.hex后再加载出来跳转后就不行了呢? 我UBL工程中还把你那三个.asm文件都加进去了试了,也不行 |
|
|
|
fstdftwew 发表于 2018-6-21 21:31 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
lifei639156 发表于 2018-6-21 22:29 1、二进制代码由armhex.exe转换而来:CCSv**toolscompilerti-cgt-arm_****binarmhex; 2、PC到达_call_swi(327680)后F5(step into)就飞掉了 |
|
|
|
fstdftwew 发表于 2018-6-21 22:35 进一步补充三个工程的信息: 1、OMAPL138DemoInterrupt工程:就是本帖一楼的附件Boot_DSP_on_SOC_V0.2.zip中的那个,稍微改造了一下GPIO初始化和while(1)进行LED闪烁toggle。 2、NANDWriter_ARM工程:通过OMAP-L138_FlashAndBootUtils_2_40OMAP-L138CCSNANDWriter这个工程改造了一下——DEVICE_init()之后不是nandwriter()而是自己写的read nand的一个函数,fopen读取armhex转换OMAPL138DemoInterrupt.out得到的OMAPL138DemoInterrupt.hex;然后再通过格式解析将各section数据载入对相应地址中;最后Entry切换至OMAPL138DemoInterrupt得到与1一样的LED闪烁效果。 3、UBL_NAND工程:通过OMAP-L138_FlashAndBootUtils_2_40OMAP-L138CCSUBL_ARM改造而来,DEVICE_init()后有UART_open(),NAND_open(),然后读取写入到NAND中的OMAPL138DemoInterrupt.hex(与2中fopen的hex内容相同,通过beyondCompare确认),然后再通过相同方法进行格式解析将各section数据载入对相应地址中;最后Entry切换至OMAPL138DemoInterrupt,到_call_swi()处跑飞——后试过将这行代码注释掉再生成新的hex、烧写、读取、加载、运行,可以正常运行在while(1),但是LED却不闪烁……进一步分析工作: 1)通过registers可以看到GPIO0ARM的OUT_DATA**确认GPxPy是有变化的; 2)直接memory确认PSC的MDSTAT对应的GPIO寄存器值为0x00001E03——也是OK的(1、2两个工程也是这个值); 彻底懵圈了…… |
|
|
|
fstdftwew 发表于 2018-6-21 22:42 附上第三个工程的程序入口代码: // Boot entry point to setup the C environment #if defined(__TMS470__) #pragma TASK(boot); #pragma NO_HOOKS(boot); #pragma CODE_SECTION(boot,".boot"); #endif void boot(void) [ asm(" .global STACK_START"); asm(" .global _stack"); asm(" .global main"); asm(" NOP"); asm(" MRS r0, cpsr"); asm(" BIC r0, r0, #0x1F"); // CLEAR MODES asm(" ORR r0, r0, #0x13"); // SET SUPERVISOR mode asm(" ORR r0, r0, #0xC0"); // Disable FIQ and IRQ asm(" MSR cpsr, r0"); asm(" NOP"); // Set the IVT to low memory, leave MMU & caches disabled asm(" MRC p15,#0,r0,c1,c0,#0"); asm(" BIC r0,r0,#0x00002300"); asm(" BIC r0,r0,#0x00000087"); asm(" ORR r0,r0,#0x00000002"); asm(" ORR r0,r0,#0x00001000"); asm(" MCR p15,#0,r0,c1,c0,#0"); asm(" NOP"); // Setup the stack pointer asm(" LDR sp,_stack"); asm(" SUB sp,sp,#4"); asm(" BIC sp, sp, #7"); // Call to main entry point main(); asm("_stack:"); asm(" .word STACK_START"); ] 汇编比较弱,分析不出个子丑寅卯来,只能从注释里大概看出来做了些啥工作。 第一个工程的程序入口代码: _init_stack:.asmfunc ; SET TO SVC MODE MRS R0, CPSR BIC R0, R0, #0x1F ORR R0, R0, #0x13 MSR CPSR_CF, R0 ; INITIALIZE THE SVC MODE STACK LDR SP, c_svc_stack LDR R0, c_SVC_STACK_SIZE ADD SP, SP, R0 ; SET TO IRQ MODE MRS R0, CPSR BIC R0, R0, #0x1F ORR R0, R0, #0x12 MSR CPSR_CF, R0 ; INITIALIZE THE IRQ MODE STACK LDR SP, c_irq_stack LDR R0, c_IRQ_STACK_SIZE ADD SP, SP, R0 ; SET TO FIQ MODE MRS R0, CPSR BIC R0, R0, #0x1F ORR R0, R0, #0x11 MSR CPSR_CF, R0 ; INITIALIZE THE FIQ MODE STACK LDR SP, c_fiq_stack LDR R0, c_FIQ_STACK_SIZE ADD SP, SP, R0 ; Continue to _c_int00 LDR PC, c_int00 .endasmfunc |
|
|
|
你是说下面boot是你的工程的入口?这显然不对吧。要么你把工程一的这部分copy到你工程里来,一般都不自己写这部分,除非自己对写汇编有信心,还有对ARM的模式切换操作很熟。 还有上面你说的飞了,call swi不会飞的,会跳到swi exception 向量表处,再从这里跳到用户的ISR。exception向量表初始化了没有?我看到注释里有 // Set the IVT to low memory, leave MMU & caches disabled是什么意思,L138不是low memory模式,向量表是固定要放在0xFFFF0000的,不是0x0000000。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
lifei639156 发表于 2018-6-21 23:19 Hi Tony, 有几点: 1、boot那段入口代码不是我写的,是TI的那个例程里自带的,如我前面帖子所示:OMAP-L138_FlashAndBootUtils_2_40OMAP-L138CCSUBL_ARM 这段代码来自OMAPL0L138_FlashAndBootUtils_2_40.zip中自带的那个工程的——这个工程你应该见过的哦。 2、你这段话应该说中关键了: 为什么这么说呢,因为我刚才又试了试,call_swi()跑飞后PC指向的地址是0x00000008,但实际上应该是0xFFFF0008!如果高16bit是FFFF那就没问题了! 可如我上面所说的,boot这个函数不是我写的,所以我也不敢改动它——这该怎么破呢? |
|
|
|
fstdftwew 发表于 2018-6-21 23:28 这里即使改了也不能完全解决问题,我看了一下代码,这个UBL里没有做向量初始化,跳到0xFFFF 0008也没有代码在哪里啊。 这个UBL工程之所以可以工作。是因为这个工程里没有中断,前面进来就设到了supervisormode,所以也不需要调用SWI,所以从UBL自身的功能实现来说没出现问题。 #1. 借鉴starterware里的相关例程,那里面是一整套都有的。 #2. 看一下我提供的另一个贴子里的关于SWI的说明,你可以用编译器自带的C环境初始化函数,按贴子里说的方法改一下ARM 的mode,默认时编译器的入口函数里切换到了user mode再跳到main,如果更编译器的入口函数在跳到main之前设为supervisor mode就行。 看哪种对你方便了。 总之这个ubl里的boot函数是不能做入口函数的,好多初始化的都没有做(比如IRQ, FIQ等),因为这个工程本身不需要哪些功能。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
lifei639156 发表于 2018-6-21 23:47 Tony,非常感谢!进一步的: 问题1、 问题2、 我昨天尝试把你OMAPL138DemoInterrupt的initstack.asm中_init_stack直接改成程序入口,exclude掉boot.c,但编译时报错,cmd文件中好几个段都出现感叹号。 我担心这块会不会有什么影响 |
|
|
|
首先ARM的初始化流程是通用的,不管是TI的ARM芯片,还是其它家的ARM芯片,这些基础知识可以看看ARM的资料。 如果暂时不想深究,就找一个能工作的例子,在上面改,把自己的代码合进去,而不是把别的工程的代码加到自己的工程里来。 现在问题找到了,原因也清楚了,也有能工作的样例工程。随便选一个starterware里的例程,在上面改就可以了啊。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
lifei639156 发表于 2018-6-22 00:10 嗯,你说的很对,至少这次折腾OMAP的bootloader让我更深入的了解了ARM和C6x的工作时序。 现在做了些改动:把你的initstack.asm和handler.asm加入,entry由boot改为_init_stack,cmd也全部换掉,另外还加入了boot.asm; 目前初步测试是OK的,可加载可跳转可过call_swi,LED能闪烁。 但又有个小问题需要你帮忙参详一下:我把boot.asm也加入到OMAPL138DemoInterrupt工程中后,编译下载带仿真器单步运行,call_swi()能进去出来,但是从switch_to_privilege_mode返回时却跑飞了,去掉boot.asm就可以了。这个我没整明白。 这个boot.asm的来源: Boot_DSP_on_SOC_V0.2OMAP-L138_FlashAndBootUtils_2_40Commonarcharm926ejsboot.asm |
|
|
|
Tony,又有个新问题……
现在我基于此前你的简单例程的boot验证已全部OK,现在移植到我们自己产品的bootloader,遇到问题卡住了。。。 前后最大的区别就是:我现在的程序是ARM和DSP都是基于SYSBIOS开发的,此前的例程都是裸机且很简单。 现在我已验证UBL可以将ARM加载并启动运行,但是ARM去启动DSP就怎么都启动不起来。 借助仿真器,我发现ARM加载DSP入口地址并把它唤醒后,通过连接DSP核,发现PC停在的地方并非_c_init00,而是卡在如下一个地址: xdc_runtime_System_formatNum_I() at System.c:496 0x********——这个地址是比_c_init00更靠前的一个地址。 顺此,无论再run还是step into单步运行,都跳不出这个函数。 顺便说一下: 如果把DSP.out通过仿真器load好后,一般来说PC会直接停到main()入口处,此时如果点击调试栏的CPU Reset操作,会发现PC也调到上述的那个函数中。 可不同的是,此时如果F8运行可到main()函数中的断点处。 这到底是为什么?该咋解决呢? |
|
|
|
lifei639156 发表于 2018-6-21 07:57 请问,在多核boot后,如何进行单步调试,查看错误? |
|
|
|
lifei639156 发表于 2018-6-22 00:10 Tony Tang您好: 这几天在合众达的开发板上试验了您给的Boot_DSP_on_SOC_V0.2.zip中的两个的例程,发现了一个奇怪的现象,通过AIS工具将armdsp.out和自己的dsp端的程序合二为一烧写后,dsp端程序应该是已经加载了,但dsp始终处于复位状态。在这种情况下仿真器(带gel文件)进入OMAPL138DemoInterrupt工程下,将loaddsp这一部分代码注释掉,只保留入口地址和启动dsp等其余部分,工程顺利运行,并且可以看到dsp正常点亮led,开始闪烁。如果直接仿真环境进入其他dsp程序,连接时报错显示dsp处于复位状态。因此从现象判断是dsp加载完代码后一直处于复位状态,还请您不吝赐教,谢谢! |
|
|
|
lsajdskalnjd 发表于 2018-6-22 01:04 今天将spi—ubl的main函数中添加了,两句kick0unlock和kick1unlock,烧写后可以正常boot,问题算是解决了。但是又发现了一个问题,烧写进合众达提供的ad采集的例程,该例程中只保留了led灯闪烁这一功能,烧写上电后加载正常,led正常闪烁,但是在编译环境中用仿真器重新连接dsp端,测试uart2的通信时,通信端口无响应,如果将led闪烁擦除烧写uart2通信例程,则仿真器连接跑uart通信和led都是正常的,有点纳闷不知道是哪方面的原因引起的 |
|
|
|
lifei639156 发表于 2018-6-22 00:10 tony 你好 我现在遇到一个问题,arm端loader负责搬运启动dsp,dsp程序运行在ddr上。 当dsp程序小时可以正常启动,但当DSP程序300k的时候 dsp启动不起来 |
|
|
|
只有小组成员才能发言,加入小组>>
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
577 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1028 浏览 1 评论
677 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
500 浏览 1 评论
1024 浏览 0 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
130浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
100浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
111浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
108浏览 12评论
TPA6304-Q1: TPA6304 两片公用一组I2C的话,其中一片配置不成功怎么办
137浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 11:26 , Processed in 0.931746 second(s), Total 84, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号