首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

DSP滴答时钟更新

DSP滴答时钟更新

本帖最后由 look_w 于 2017-9-23 15:37 编辑

迁移到操作系统的Flash烧写在之前“通用方法”一文中,已经详述了如何烧写裸机的代码,这里只需要对DSP/BIOS工程做很少的改动,就可无缝的将之前的烧写方法用在这里,下面还是按步骤来,主要描述一些不同的地方(这样清晰些):
  • 添加二级Bootloader用到的文件(3个)到工程中,如下图,

    确定下boot_c671x.s62文件中的copy_done函数是这样的:
    copy_done:    mvkl .S2 _c_int00,b0    mvkh .S2 _c_int00,b0    b    .S2 b0    nop   5而不是这样的:
    copy_done:    mvkl .S2 _main,b0    mvkh .S2 _main,b0    b    .S2 b0    nop   5因为我们要先执行从Flash拷贝代码到内存,再执行c_int00跳转到main函数。
    到这里下载三个bootloader文件!如果您使用的RAM或Flash与我的不同,请修改c6713_emif.s62中关于EMIF接口的寄存器配置!
  • 划分Memory,设置“段”

    这就按照“中裸机划分内存的方法划分,
    MEMORY{    BOOT_RAM   : o=00000000h,l=00000400h    IRAM       : o=00000400h,l=00040000h    FLASH_BOOT : o=90000000h,l=00000400h    FLASH_REST : o=90000400h,l=000FFB00h}heap放在了IRAM上。

    如上图,也按照“”按中的cmd分配的,大都分配到IRAM中不容易出问题(虽然说多占用一些RAM吧)。
  • 写cmd文件(user.cmd,如上图)
    DSP/BIOS已经自动生成了一个CMD文件,最好不要去修改,只需要将DSP/BIOS自动生成的从工程中移除(不是删了,而是Remove),自己新建一个,将DSP/BIOS的包含进来就行了,
    -lbios_firstcfg.cmd-lcsl6713.libSECTIONS{        /* RAM */    .boot_load: {} > BOOT_RAM    /* User defined */  }-lbios_firstcfg.cmd将自动生成的包含进来,关键是增加了.boot_load段,该段专门用于放置二级Bootloader。将user.cmd包含到工程中。
  • 修改DSP/BIOS复位中断
    在“”中,曾经修改vecs.s汇编文件,将原来的复位向量
    vectors:vector0:   VEC_ENTRY _c_int00    ;RESETvector1:   VEC_ENTRY _vec_dummy  ;NMIvector2:   VEC_ENTRY _vec_dummy  ;RSVD改成了
    vectors:vector0:   VEC_ENTRY _boot       ;RESETvector1:   VEC_ENTRY _vec_dummy  ;NMIvector2:   VEC_ENTRY _vec_dummy  ;RSVD这里也一样,只不过可以通过IDE直接修改,

    这里的_boot就是二级Bootloader文件boot_c671x.s62中的boot段。
  • 好了,没什么事了,你可以编译,接着按“”中的方法完成烧写了。
给自己也给大家的忠告还在1~2个月之前,我还对DSP烧写Flash一无所知,更对DSP/BIOS一无所知,然后,从网络上Download了十来篇论文,然后一篇一篇的看了一遍,虽说不能立刻完全明白,但零星的还是感觉知道了那么一点,然后准备自己动手写,却发现无处着手——那些论文尽是框架大论!完全无法满足初学者的需求。
于是又在网上Google/Baidu浪淘沙一样的想找一些简单的,尤其是给出几乎每步详细步骤的,可惜的是——毫无所获!后来想想,折腾了这么几天,还是不知道从哪入手,不行了,于是去找来了TI的关于二级Bootloader的手册,一页页的看(其实手册很短,也就十几二十页),突然发现慢慢有了些眉目。TI的手册上给出了二级引导的源码,并描述了那样做的原因和过程,于是根据该手册提供的相关资料一点点将Bootloader的过程拼凑了起来!关键是在_c_int00和main函数之间下功夫。
后来就参考TI的文档开始写了,但启动文件是写好了,但怎么烧写到Flash中一直困扰着我,如果烧写和应用程序在同一个程序中,那不是就成了“鸡生蛋还是蛋生鸡”的问题了吗?(其实这个可以通过硬件上外置一个拨码开关来设置,就可以令程序自烧写)。然而我也没有开关,从一个QQ群里咨询了一位大牛,大牛给了我一份他烧写的方法,顿时豁然开朗,把DSP张载程序后在内存运行的东西先都读出来,在通过另一个工程烧写不就可以了吗?我最后就是这么做的,在这过程中还一直庆幸自己对cmd文件、内存等还算了解,甚至在将从内存中导出的东西修改成头文件还用到了VIM(神一样的编辑器)。学习DSP/BIOS,我庆幸之前已经用过了uCOS ii,很快就入门了,所谓“书到用时方恨少”,当然自知其中韵味了。
有些网友看过我的“”一文,于是来问我:
“怎么我直接拷贝哪些汇编过去不行呢?”然后,我回答:
“您能回去看看那汇编是干什么的吗?”回答说:
“汇编太复杂了,您就说下为什么吧。”好吧,我实在不知怎么去劝导他,只有深刻体会这些汇编实现的功能及整个启动的流程(代码执行/跳转的过程),才能保证不管硬件怎么变、环境怎么变,都能正确的成功的烧写!
IT界一直存在着这么一种观点:
“这代码什么的都有了,会用就行了,不用重复造轮子!”这话没错,可惜用错了地方,我只能说:
“轮子是有了,可这轮子好使吗?敢保证跑它十天八天不会挂吗?”一旦成了标准,你可以不用重复造轮子了,否则,“不断的改进”才是创造的源泉!
返回列表