在睡眠前存储上下文(PIC)

问题描述 投票:0回答:1

想知道是否有人知道正确的 C 语法来在 PIC 24F 休眠之前存储上下文(在我的例子中只有一个 int),然后在唤醒时恢复它。

示例代码(Microchip 应用笔记)应该将上下文存储在 DSGPRO 中,设置 DSEN 位并调用 sleep 是 -

asm("MOV #0x8000, w2");
    asm("MOV w2, DSCON");
    asm("MOV w2, DSCON");
    asm("PWRAV #0")

我的(可能很差)C 中的等价物(将 int 存储在 led_step 中)是

int *a = (int*) 0x8000;
    *a = led_step;
    
    IFS1bits.INT2IF = 0;        //clear interrupt flag.
    INTCON2bits.INT2EP = 1;     //Interrupt iNT2E is on the falling edge
    IPC7bits.INT2IP = 7;        //set highest interrupt priority to INT2
    IEC1bits.INT2IE = 1;        //Enable INT2IE interruption
    CTMUCONbits.CTMUEN = 0;     //Disable CTMU module
    Sleep();                    // sleep();

但这只会导致睡眠时输出切换。睡眠/唤醒功能确实有效,变量存储/恢复有问题。

感谢您的想法。

c embedded pic
1个回答
0
投票

Microchip 代码是内联汇编可嵌入到 C 代码中。他们很可能正是因为它无法在 C 代码中完成而使用了它 - 访问非内存映射寄存器时就会出现这种情况。

如果您使用的是 XC16 以外的编译器,您的编译器的内联汇编语法可能会有所不同,但肯定会以某种方式支持它。 我认为XC16支持GCC风格的内联汇编。

答案就是简单地使用内联汇编,可以逐字提供,也可以根据需要针对您的特定编译器进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.