由于在后台程序和中断程序中都使用了MSP430 的硬件乘法器,于是使用一下保存和恢复寄存器,但是编译过程报错( Illegal mnemonic specified),请问如何解决?
/* PUSH Multiplier Register */
// asm("PUSH.W &MPY32CTL0");
// asm("PUSH.W &RES1;");
// asm("PUSH.W &RES0;");
// asm("PUSH.W &MPY32L;");
// asm("PUSH.W &OP2L;");
…… // ISR code
/* POP Multiplier Register */
// asm("POP.W &OP2L");
// asm("POP.W &MPY32L");
// asm("POP.W &RES0");
// asm("POP.W &RES1");
// asm("POP.W &MPY32CTL0");
Young Hu:
您好,
请问您使用CCS吧?
以asm("PUSH.W &MPY32L");为例
在"和PUSH之间加一个Tab,即:
asm(" PUSH.W &MPY32L");
David Liu1:
回复 Young Hu:
Hi 蝈蝈,
如您所说,修改后。之前的非法助记符的错误不在提示,取而代之是一下错误? 我是用的是 CCSv4 MSP430 CGT4.0
"C:\DOCUME~1\MS\LOCALS~1\Temp\0717210", ERROR! at EOF: [E0300] The following
symbols are
undefined:
1 Assembly Error, No Assembly Warnings
MPY32CTL0
Errors in Source – Assembler Aborted
>> Compilation failure
gmake: *** [source/Interrupt_Handler_DRV92250.obj] Error 1
Young Hu:
回复 David Liu1:
您好,
错误提示是说MPY32CTL0没有定义,去头文件中看看硬件乘法器的控制0寄存器是怎么定义的。
David Liu1:
回复 Young Hu:
SFR_16BIT(MPY32CTL0); /* MPY32 Control Register 0 */
David Liu1:
回复 David Liu1:
SFR_16BIT(MPY32CTL0); /* MPY32 Control Register 0 */
头文件使用的是ti提供的头文件,包含了对该寄存器的定义,但是仍旧无法识别。
Young Hu:
回复 Young Hu:
还有个链接,供参考
e2e.ti.com/…/102998.aspx
David Liu1:
回复 Young Hu:
使用以下程序,编译后,查看汇编程序,发现汇编正确,但是程序不跑了,也不产生中断了。不知道是不是栈溢出了。CCSv4下如何设置堆栈深度,我可以做个实验试试。
请问有没有中断保存 硬件乘法器 寄存器 的程序? 以下的是参考 430 5X UG 写的,但是实验却不成功,出现上述问题。
#pragma vector = TIMER0_B0_VECTOR // 53
interrupt void MainISR_TB0(void)
{
// /* PUSH Multiplier Register */
asm(" PUSH.W &0x04ec ;PUSH.W &MPY32CTL0 ");
asm(" PUSH.W &0x04e6 ;PUSH.W &RES1 ");
asm(" PUSH.W &0x04e4 ;PUSH.W &RES0 ");
asm(" PUSH.W &0x04d0 ;PUSH.W &MPY32L ");
asm(" PUSH.W &0x04e0 ;PUSH.W &OP2L ");
/* Enable all maskable interrupts */
_enable_interrupt();
…… // ISR routine
_disable_interrupt();
/* POP Multiplier Register */
asm(" POP.W &0x04e0 ;PUSH.W &OP2L ");
asm(" POP.W &0x04d0 ;PUSH.W &MPY32L ");
asm(" POP.W &0x04e4 ;PUSH.W &RES0 ");
asm(" POP.W &0x04e6 ;PUSH.W &RES1 ");
asm(" POP.W &0x04ec ;PUSH.W &MPY32CTL0 ");
}
Young Hu:
回复 David Liu1:
设置堆栈大小:右键点击工程文件,选择build properties,点击Linker下的Basic Options。如图所示
David Liu1:
回复 Young Hu:
总结一下这个问题:
去除了堆栈溢出的问题后,可以保护实现乘法器的值的出入栈,证明 asm(" POP.W &0x04e4 ;PUSH.W &RES0 ") 这样的方法是可行的。
thx~