工具/软件:TI C/C++编译器
调试期间、MULT16_F5HW.asm 中的软件中断。
这意味着什么? 我不知道! 与中断 IM 相关的段
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:TI C/C++编译器
调试期间、MULT16_F5HW.asm 中的软件中断。
这意味着什么? 我不知道! 与中断 IM 相关的段
我还会发现一些其他的东西。。。
我有一些 ADC 输入... 我多次使用以下代码.. 这些指令需要大约2ms 的时间才能运行... 时间不是问题 CPU 没有太多工作... 但我决定用常量重写。
current1 =(无符号长整型) getADC (ADC_CS1)* 2500 / 0x0FFF / 6.8;
current2 =(无符号长整型) getADC (ADC_CS2)* 2500 / 0x0FFF / 6.8;
电压=(无符号长整型) getADC (ADC_VS)* 2500 / 0x0FFF * 7.8;
电流1 = getADC (ADC_CS1)* 10 / 111;
current2 = getADC (ADC_CS2)* 10 / 111;
电压= getADC (ADC_VS)* 14/3;
某些精度会丢失、但 现在运行该代码需要.75ms。 和代码没有问题。
接下来、我将其更改为测试。
电流1 = getADC (ADC_CS1)* 10 / 111;
current2 = getADC (ADC_CS2)* 10 / 111;
电压= getADC (ADC_VS)* 4.7;
使用浮点可增加时间.. 我的代码再次在 MULT16_F5HW.asm 中中断..
当它中断时、它在 NOP 指令处停止。 我仍然不知道这里发生了什么 为什么 CCS 会中断 NOP 指令?
我还会发现一些其他的东西。。。
我有一些 ADC 输入... 我多次使用以下代码.. 这些指令需要大约2ms 的时间才能运行... 时间不是问题 CPU 没有太多工作... 但我决定用常量重写。
current1 =(无符号长整型) getADC (ADC_CS1)* 2500 / 0x0FFF / 6.8;
current2 =(无符号长整型) getADC (ADC_CS2)* 2500 / 0x0FFF / 6.8;
电压=(无符号长整型) getADC (ADC_VS)* 2500 / 0x0FFF * 7.8;
电流1 = getADC (ADC_CS1)* 10 / 111;
current2 = getADC (ADC_CS2)* 10 / 111;
电压= getADC (ADC_VS)* 14/3;
某些精度会丢失、但 现在运行该代码需要.75ms。 和代码没有问题。
接下来、我将其更改为测试。
电流1 = getADC (ADC_CS1)* 10 / 111;
current2 = getADC (ADC_CS2)* 10 / 111;
电压= getADC (ADC_VS)* 4.7;
使用浮点可增加时间.. 我的代码再次在 MULT16_F5HW.asm 中中断..
当它中断时、它在 NOP 指令处停止。 我仍然不知道这里发生了什么 为什么 CCS 会中断 NOP 指令?
[引用用户="George mock"]
Gerald Talley调试期间、MULT16_F5HW.asm 中的软件中断
您认为什么会导致您认为出现了问题? 您到底是如何看到它的?
谢谢、此致、
乔治
调试代码时停止
我还会发现一些其他的东西。。。
我有一些 ADC 输入... 我多次使用以下代码.. 这些指令需要大约2ms 的时间才能运行... 时间不是问题 CPU 没有太多工作... 但我决定用常量重写。
current1 =(无符号长整型) getADC (ADC_CS1)* 2500 / 0x0FFF / 6.8;
current2 =(无符号长整型) getADC (ADC_CS2)* 2500 / 0x0FFF / 6.8;
电压=(无符号长整型) getADC (ADC_VS)* 2500 / 0x0FFF * 7.8;
电流1 = getADC (ADC_CS1)* 10 / 111;
current2 = getADC (ADC_CS2)* 10 / 111;
电压= getADC (ADC_VS)* 14/3;
某些精度会丢失、但 现在运行该代码需要.75ms。 和代码没有问题。
接下来、我将其更改为测试。
电流1 = getADC (ADC_CS1)* 10 / 111;
current2 = getADC (ADC_CS2)* 10 / 111;
电压= getADC (ADC_VS)* 4.7;
使用浮点可增加时间.. 我的代码再次在 MULT16_F5HW.asm 中中断..
当它中断时、它在 NOP 指令处停止。 我仍然不知道这里发生了什么 为什么 CCS 会中断 NOP 指令?
[引用 user="archaeology">在您的第一个帖子中、您说问题"似乎与我正在使用的中断有关;"是什么导致您怀疑问题与中断有关? 您仍然认为它可能相关吗?
非常有趣 此时、我们需要 MSP430硬件专家来研究这个问题。 我认为我们无法在编译器论坛上为您提供更多帮助、因为这是一个硬件问题、我们是编译器专家。 作为一个疯狂的猜测、使用 DINT 会强制 CPU 在禁用中断之前处理一些挂起的中断、这可能会在该 NOP 上出现。
某些 MSP430器件(如 F5系列)具有硬件乘法硬件、但它不在 CPU 中完成;相反、有一个乘法外设。 通过写入专用存储器映射寄存器、等待适当数量的周期以及从结果寄存器中读取结果来执行乘法。 由于计算乘法运算需要全局状态、因此库会围绕乘法外设的使用创建一个关键区域、以便在乘法外设已经忙线时不会发生中断并执行乘法、这会损坏这两个结果。 因此、在中断和乘法硬件之间进行协调非常重要。 MSP430编译器用户指南第2.3.4节"运行时模型选项"对此进行了简要介绍。
您好 Gerald、
您正在使用 MSP430FR5959器件、对吧? 该器件具有 MPY32硬件乘法器模块、因此考古学家在上一篇文章中关于库处理方式的评论应该适用于该器件。
您的 ISR 中是否有任何一个调用其他函数? 您是否有任何嵌套中断(不建议这么做)、这意味着在 ISR 期间启用中断? 也许您可以共享您的 ISR 代码? 您的乘法在代码中的哪个位置发生?
此致、
Katie
下面是我的代码。 通信 ISR 有很多工作要做、但速度相当快。 我经常使用该代码。 四路 ISR 实际上是基本的。 当引脚上发生中断时、它会检查另一个引脚并递增或递减计数器。 计时器也很简单... 当我的代码暂停时、我可以看到堆栈吗? 以查看我的堆栈是否溢出? 代码决定中断的原因是什么? 每次我觉得我都换了一些东西,它的工作做得很好 我在这里停留了一会... 我没有在任何 ISR 中执行任何 mult 或 div 函数。 不调用任何函数.. 我找不到碰撞发生的地方
//计时器
#pragma vector=Timer1_A1_vector
_interrupt void Timer1_A3_ISR (void){
开关(__evo_in_range (TA1IV、14)){
情况0:
中断;//无中断
案例2:
flag_50ms = 1;
TA1CCR1 += 20000;
中断;// CCR1
案例4:
flag_250ms = 1;
TA1CCR2 = 100000;
中断;// CCR2
案例6:
中断;//保留
案例8:
中断;//保留
案例10:
中断;//保留
情况12:
中断;//保留
案例14:
中断;//溢出
默认值:
中断;
}
}
//quad
#pragma vector=Port1_vector
_interrupt void P1 (void){
IF (P1IFG & BIT0){
IF (P1IN 和 BIT1)
国家1-= 100;
其他
国家1 +=100;
}否则、如果(P1IFG 和 BIT2){
IF (P1IN 和 BIT3)
国家2-= 100;
其他
count2 +=100;
}
P1IFG = 0;
}
#pragma vector=USCI_A0_Vector
_interrupt void USCI_A0_ISR (void){
开关(_evo_in_range (UCA0IV、18)){
情况0://vector 0无中断
中断;
案例2://vector 2 UCRXIFG
如果((UCA0STATW 和 UCADDR)== 2){
RX_ST态= 1;
UCA0CTL1 |= UCDORM;//仅接收地址位数据
}
开关(Rx_state){
案例1:
RX_ADDRESS = UCA0RXBUF;
RX_address2 = 0;
xaddress = 0;
if (rx_address =(camera1X_gc_adr + thisAddress)){
UCA0CTL1 &=~UCDORM;
RX_ST态= 2;
}否则、如果(Rx_address = camera_gc_adr){
UCA0CTL1 &=~UCDORM;
RX_ST态= 3;
}否则、如果(rx_address == cameratilT_gc_adr){
UCA0CTL1 &=~UCDORM;
xaddress = DATA_CAM_Tilt;
转至跳转;
}
中断;
案例2://扩展地址
RX_address2 = UCA0RXBUF;
if (rx_address2 & 0x40){
if (rx_address2 = 0x41){
LRC = Rx_ADDRESS ^ Rx_ADDRES2;
RX_ST态= 9;
SEGI = 0;
}
中断;
}否则、如果(rx_address2 >= 16){
RX_ST态= 0;
UCA0CTL1 |= UCDORM;//仅接收地址位数据
中断;
}
跳转:if (data[rx_address2 + xaddress].reg & reg_writeMode){
RX_ST态= 3;
}否则{
unsigned int v;
v = data[rx_address2 + xaddress].value;
TX_DATA[0]=(v >> 8);
TX_DATA[1]= v;
TX_DATA[2]= TX_DATA[0]^ TX_DATA[1]^ RX_ADDR_ADDRESS ^ RX_ADDRES2;
TX_ST态= 0;
UCA0TXBUF = 0x66;
UCA0CTL1 |= UCDORM;
}
中断;
案例3://MSB
MSB = UCA0RXBUF;
RX_STUDE++;
中断;
情况4://LSB
LSB = UCA0RXBUF;
RX_STUDE++;
中断;
案例5://LRC
LRC = UCA0RXBUF;
RX_state = 0;//重置 rxstate
UCA0CTL1 |= UCDORM;//仅接收地址位数据
if (rx_address == camera_gc_adr){
如果((rx_address ^ msb ^ lsb)= LRC){//计算 LRC。 如果 LRC !=0,则不保存 CONTRAL_DATA。
data[data_camera_Control].value = lsb;
commGood = 1;
}
}否则、如果(rx_address ^ rx_address2 ^ msb ^ lsb = LRC){//计算 LRC。 如果 LRC !=0,则不保存 CONTRAL_DATA。
data[rx_address2 + xaddress].value =(msb << 8)+ lsb;
commGood = 1;
}
中断;
案例9:{//接收代码源
SEG[SEGI]= UCA0RXBUF;
LRC ^= seg[SEGi];
eofrc[SEGi]^= seg[SEGi];
SEG++;
如果(SEGI ==19){
SEG++;
如果(LRC = 0){
if (seg[0]= CODE_Address){//address
地址=(*((unsigned long*) seg[2]));
add =(unsigned char*)(地址- 0x8000);
data[data_Thruster_UpdateStatus].value =((unsigned long) add)& 0x7FFF);
}否则、如果(seg[0]= CODE_Line){
unsigned int i;
对于(I = 0;I < seg[1];I++)
*add++= seg[i + 2];
data[data_Thruster_UpdateStatus].value =((unsigned long) add)& 0x7FFF);
}否则、如果(seg[0]= CODE_EOF){
unsigned int i;
DATA[DATA_Thruster_UpdateStatus].value = 0xFFFF;
对于(i = 2;i <= 17;i++){
if (eofrc[i]){
DATA[DATA_Thruster_UpdateStatus].value = 0xFEEE;
中断;
}
}
}否则、如果(seg[0]= code_deploy){
if (data[data_Thruster_UpdateStatus].value == 0xFFFF)
flag_depoy = 1;
}否则、如果(seg[0]= code_Start){
unsigned int i;
对于(I = 0;I < 19;I++)
eofrc[i]= 0;
DATA[DATA_Thruster_UpdateStatus].value = 0xFDDD;
}
}
}
}
}
案例4:
//向量4 UCTXIFG
中断;
案例6:
接收到//起始位
您好 Gerald、
此处提供了一些有关尝试识别堆栈溢出或您正在使用的堆栈的信息: processors.wiki.ti.com/.../Stack_and_Heap_size_requirements 。这适用于 CCSv4、但我认为它仍应适用。 CCS 中有一个用于堆栈溢出中断的功能-我想知道默认情况下是否启用了该功能?
运行这些测试时是否启用了任何其他断点?
此致、
Katie