TI中文支持网
TI专业的中文技术问题搜集分享网站

请教关于MSP430 inline ASM 的问题

由于在后台程序和中断程序中都使用了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~

赞(0)
未经允许不得转载:TI中文支持网 » 请教关于MSP430 inline ASM 的问题
分享到: 更多 (0)