|
7.4 堆栈问题 在汇编程序中对堆栈的依赖很小,但在C程序中分配局部变量、变量初始化、传递函数变量、保存函数返回地址、保护临时结果功能都是靠堆栈完成。而C编译器无法检查程序运行时堆栈能否溢出。 7.5 程序跑飞问题 编译后的C程序跑飞一般是对不存在的存储区访问造成的。首先要查.MAP文件与memory map图对比,看是否超出范围。如果在有中断的程序中跑飞,应重点查在中断程序中是否对所用到的寄存器进行了压栈保护。如果在中断程序中调用了C程序,则要查汇编后的C程序中是否用到了没有被保护的寄存器并提供保护(在C程序的编译中是不对A、B等寄存器进行保护的)。
8 命令文件的编写 在编辑*.cmd文件时编译连接器默认:page 0就是ROM区,page 1就是RAM区。下列段必须放在ROM区。 .text load = PROG PAGE 0 ;程序段 .const load = data PAGE 0 ;常数段 .cinit load = data PAGE 0 ;初始化段 .switch load = data PAGE 0 ;switch指令常数表
值得注意的是尽量不要用FILL选项,一旦进行填充会使生成的.out文件增大甚至超过内部的存储空间而无法Bootload。
9 Bootload问题 一般都采用从EPROM引导,但通常很费脑筋。下面介绍一下可为54X系列DSP内部引导程序识别的EPROM存储结构,见下表: EPROM内容地址08AAh或10AAh SWWSR(等待状态产生寄存器)值16 BSCR(页切换控制寄存器)值16 入口点XPC(外部存储器映射寄存器)值7 入口点PC(程序地址寄存器)值16 第一块的大小16 第一块的入口点XPC(外部存储器映射寄存器)值7 第一块的入口点PC(程序地址寄存器)值16 代码(1)16 ...... 代码(N)16 最后一块的大小16 最后一块的入口点XPC(外部存储器映射寄存器)值7 最后一块的入口点PC(程序地址寄存器)值16 代码(1)16 ...... 代码(N)16 0000h(标志引导表结束) ...... ...... ...... EPROM的启始地址(如8000h) 首地址 FFFFh -BSCR 0f800h ;设置4K为一页,页面切换时插入1个等待状态 -o cdpd.hex ;转换成cdpd.hex文件 -i ;intel格式 -boot ;把所有的程序块装入EPROM -bootorg 8000h ;从EPROM存储器的8000h处开始写入程序内容 -memwidth 8 ;系统数据宽度转为8位,以避免生成2个文件 -romwidth 8 ;EPROM 数据宽度为8位 -e 0840h ;从0840h开始执行程序 -map wfcdpd.mxp ;生成EPROM存储器占用映射 本新闻共 4页,当前在第 3页 [1] [ 2] [ 3] [ 4] |