关于TI公司DSP工程调用DELAY_US()进入非法中断问题的解决

最近笔者在调试一个DSP程序时,发现在ad外设初始化时无法正常执行,单步检查,发现当执行到调用 DELAY_US(1000);语句时,就跳入非法。

进一步追查,DELAY_US()是宏定义函数,在笔者的程序中实际调用的是F28x_usDelay(),而这个函数是TI提供的库函数,因为笔者使用了基于FLASH的CMD文件,所以这个函数被分配在FLASH中,但需要复制到RAM中运行。

仔细检查了笔者的程序,发现复制相关函数到ram区的代码部分,即 memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);并未执行

而这部分语句在源程序里依赖宏定义条件语句#ifdef _FLASH,

原来是未宏定义声明_FLASH,造成相关函数未复制到对应ram区中,导致程序执行时在ram区中无法正确寻址到相关函数,从而跳入非法中断。

在工程里增加预定义_FLASH,重新编译,问题解决。

做个小笔记,以防后续出现同样问题。

原文地址:https://www.cnblogs.com/arron-zx/p/11696937.html

时间: 2024-10-24 13:06:44

关于TI公司DSP工程调用DELAY_US()进入非法中断问题的解决的相关文章

TI C66x DSP 系统events及其应用 - 5.5(ISR调用)

在5.4中向event(eg,event 45)注册了callback函数(eventInterruptIsr),该函数会在什么时候调用呢? 该callback函数会在Event_CombinerIsr中断服务函数中调用,前面讲到过systemEvent 4~127作为eventCombiner的输入,而EventCombiner的输出event 0~3,event 0~3是与CPU中断输入INT4~15对应的vector 1~12绑定的(假设event 1与vector 4绑定),所以当eve

TI C66x DSP 系统events及其应用 - 5.4(event与ISR配置)

根据5.2中的讲解,当监控high priority queue的PDSP channel设定好后,那么与之对应的event就知道了(PDSP channel与event一一对应)(注意5.x讲的是中断的配置,并不是exception的配置,4.x讲的是exception) 中断event与ISR配置代码如下,目的是使event与ISR建立联系: /*Configure event*/ EventCombinerEventConfig( systemEvent,  (TEventCombiner

TI C66x DSP 系统events及其应用 - 5.12(vector的创建)

下面的创建中断向量表的代码,可以将段vecs(存储中段向量表的段)重定位到某个地址,如DSP的L2起始地址(对于core1,是0x10800000),同时要将ISTP指向这个地址. ;create interrupt vector table for C6000 DSP ;-------------------------------------------------------------- ;This file can be modified to add Interrupt Servic

TI C66x DSP 四种内存保护问题 -之- 外设访问corePac内部资源时的内存保护问题

Problem Description Josnch星球是一个赌博之风盛行的星球.每个人一出生就有一定数额的钱,之后的所有收入只能由赌博获得(OMG,如果RP不好,输光了所有的钱...)假设赌博公司的某场赌博有N个结果,每个结果能获得的赔率比分别是a[1],a[2]...a[N].假设现在XXX有X块钱,问他选择怎样的策略才能使得最坏情况下回报最大(假设N个结果中只有一个是有回报的,X块钱必须全部用在这次赌博上,赔率比就是a[i],假设你在第 i 个结果中投入了 y 块钱,那么你的回报是 y *

TI C66x DSP 指令集 -之- ADDKPC

ADDKPC指令的作用是通过一条指令实现返回地址的保存与nop指令的执行.在调用B指令实现真正跳转前,要保存下一条指令的地址(为了执行完跳转程序后,能够返回),并同时执行n个nop指令.该指令有助于减小设置函数调用的返回地址时使用的指令数. 如下面的汇编代码,未使用ADDKPC指令时,在B指令后要保存LABEL的地址到B3寄存器(因为B指令在5个cycle后才会起作用,所以保存LABEL地址的两条指令会执行到,因为只需2个cycle),然后执行3个nop,这样在B指令后,共用了5个cycle,下

TI C66x DSP 系统events及其应用 - 5.3(Interrupt)

对于TI C66x DSP的每个CPU有INT4~15共12个中断输入.对于中断,event combiner将INTC的输入event 4~127分为4个组(event 0~3为INTC内部使用,如图示为event combiner的四个输出),然后event 0~127作为Interrupt Selector的输入.类似于4.x中的exception,中断也有同样功能的event flag,event mask,masked event flag寄存器. Interrupt Seclctor

TI C66x DSP 系统events及其应用 - 5.8(ISTP)

中断服务表指针ISTP(Interrupt Service Table Pointer)寄存器用于定位中断服务程序的位置,即ISTP指明中断发生后去哪里找要执行的程序,ISTP(其中的ISTB字段)就是指向IST表的寄存器.ISTP中的一个字段ISTB确定IST的地址基数部分:另一个字段HPEINT确定特定的中断并定位特定的取指包在IST中的位置.图6-4所示为ISTP的各字段,表6-2描述了各字段及其如何使用. 下图为ISTP寄存器,bit 0~4必须设置为0,即IST表的起始地址或者说获取包

TI C66x DSP 系统events及其应用 - 5.9(IST重定位)

RESET中断的获取包必须位于0地址处,然后其他中断的获取包可以位于任何256字(1k字节边界)对齐的程序空间.IST的位置由ISTP寄存器中的ISTB字段决定. IST重新定位举例: 1,将IST重新定位到800h: 将地址0h~200h的源IST拷贝到800h~A00h中: 将800h写到ISTP寄存器中: MVK 800h,B2 MVC B2,ISTP 则ISTP = 800h = 1000 0000 0000b 2,ISTP引导CPU重新定位的IST中去顶相应的ISFP(指令获取包) 假

TI C66x DSP 系统events及其应用 - 5.10(中断控制寄存器)

C66x DSP执行中断的简要流程: 1.使能了全局中断和子中断,如果硬件检测到中断发生,那么CPU就要跳转. 2.软件把CPU内部的A,B类寄存器的值等推入堆栈保存,把当前PC寄存器的值放入IRP/NRP寄存器中以备中断返回能找到当前被打断的位置. 3.CPU的PC指针读出中断向量表的地址,也就是把"ISTP寄存器的ISTB值+子中断向量偏移量"装入PC寄存器,这样就执行跳转. 4.在中断向量表里一般有就用跳转指令,这样就可以跳转到我们用C语言编写的中断服务子程序中.由于我们在一般的