官方自带了一个延迟程序:
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) – 9.0L) / 5.0L)
为什么我每次调用时,就会跳到非法指令的中断中去?
另外还有个问题:
9.0和5.0后面带个L是什么意思?
Blake Ma:
Hi, Lzh4774
(1)为了保证代码实行的速率和准确性,DELAY_US()函数需要运行在RAM中,不知道您在调用之前有没有在工程中进行相应的操作?
(2)编译器默认浮点为double类型,64位, 如果在浮点后面加上F 就指定编译 为float类型 32位;如果在浮点后加上L,就指定为 long double 类型,128位。
官方自带了一个延迟程序:
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) – 9.0L) / 5.0L)
为什么我每次调用时,就会跳到非法指令的中断中去?
另外还有个问题:
9.0和5.0后面带个L是什么意思?
Bruce:
回复 Blake Ma:
没有,我直接下载到FLASH中单步调试的!
官方自带了一个延迟程序:
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) – 9.0L) / 5.0L)
为什么我每次调用时,就会跳到非法指令的中断中去?
另外还有个问题:
9.0和5.0后面带个L是什么意思?
Bruce:
回复 Bruce:
#pragma CODE_SECTION("XXXXX","ramfuncs")
这里的XXXXX应该是一个函数的名称,DELAY_US是一个宏定义
可以直接写成:
#pragma CODE_SECTION("DELAY_US","ramfuncs")吗?
官方自带了一个延迟程序:
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) – 9.0L) / 5.0L)
为什么我每次调用时,就会跳到非法指令的中断中去?
另外还有个问题:
9.0和5.0后面带个L是什么意思?
Blake Ma:
回复 Bruce:
在工程文件 DSP2803x_usDelay.asm 中,可以找到 DELAY_US() 的定义如下所示:
从这段代码中可以看出,DELAY_US() 是被定义在 ramfuncs 段中,如果在程序中调用该函数,则 PC 指针会跳转到相应的 RAM 存储空间内执行该函数。
所以:
(1)不需要在自己的代码中额外地将 DELAY_US() 再次声明为 ramfuncs。
(2)但是示例工程文件中并没有将 DELAY_US() 从Flash 搬移到 RAM 的相应代码,如果运行在 Flash 中的程序需要调用 DELAY_US() ,则需要在自己的代码中添加代码搬移函数 MemCopy(),并在调用 DELAY_US() 之前先执行 MemCopy()。
当然,如果工程中没有定义 Memcopy() 函数,还需要对其进行定义,并且声明所用到的全局变量。相关内容已经在之前 ”搬移到RAM中运行“ 的帖子中回复,实现方法相同,在这里就不赘述了。