主题中讨论的其他器件: MSP-FET、 MSP430F6659、 MSP430F2274、 MSP430WARE
工具/软件:Code Composer Studio
我有一个用于 MSP430i2041芯片的小程序、有点奇怪
它的定时器中断服务例程(ISR)中的行为。 我正在使用 CCS
我最近才升级到的版本9.2.0.00013。 计时器 ISR
在本帖子的末尾全部显示。
问题涉及中断时全局变量的值。
我有一个名为"sCountdown _DS"的无符号整数全局变量
我在编译时分配值100。
当我在调试器下运行该程序时、检查的值
一旦调试器在的入口点停止、就会立即出现 sCountdown
程序中、变量确实包含值100。 但是、何时
我让调试器运行到 ISR 中的第一条指令、变量
sCountdown DS 包含值0。 奇怪的是、ISR 有另一个
具有正确值的全局变量(名为 sInitDelay_DS)
在进入 ISR 时。 显然只有 sCountdown DS 具有
问题。
ISR 也不能正常工作、因此我得出结论
这是编译器或链接器问题、而不是调试器问题。
似乎没有将 sCountdown DS 视为全局变量、
即使是 sInitDelay_DS 也是如此。 奇怪! 有什么想法吗? 是否有任何已知的信息
与此相关的错误?
-eNick
--------------------------------------------------
// TimerGen.c
//用于编程 CCSi2041的通用程序计时器 ISR
#include //包括 TI 定义
#include "CCSi2041.h"//包括我自己的程序定义
//开始定义全局变量
//
U16 sInitDelay_DS = init_delay_ds;// DS 中的程序初始化延迟
U16 sInitDoneFlag = 0;//在程序初始化结束时将为非零
U16 sCountdown DS = 100;//向下一 DS 倒计时
U16 sAckhold_ds = 0;// DS 中的"Ack Holddown"时间
U16 sAckHoldFlag = 0;//如果非零、"Ack"保持足够长的时间来清除计数器
U16 sAckNowFlag = 0;//当"Ack"按钮被按下时为非零
//
//全局变量的结束定义
//开始对外部全局变量的引用
//
//
//结束对外部全局变量的引用
#pragma vector=TIMER0_A0_VECTOR
_interrupt void TA0_ISR (void)
{
//每秒获取1、000次
//现在将倒计时到下一个 DS
sAckNowFlag = 0;//zzzz 多余的 ISR 第一条指令
sCountdown_DS--;//向下一个 DS 倒计时
如果(sCountdown DS!= 0)返回;//如果尚未在下一个 DS 完成则全部完成
//现在将执行每个 DS 必须处理的所有操作
sCountdown DS = 100;//重新加载 DS 倒计时
FlashI ();//处理错误 LED 闪烁
//现在将处理程序初始化延迟
如果(sInitDelay_DS)//初始化延迟计时器仍在运行
{
sInitDelay_ds-;//计算此附加 DS
如果(!sInitDelay_DS)//计时器刚刚超时
{
sInitDoneFlag = 1;//为 MainLoop 标记此项
}
}
//现在将处理"Ack"按钮
如果((ACK_PB_PORT 和 ACK_PB_BITP)= 0)//如果按下"Actk"按钮
{
sAckNowFlag = 1;//标记此条件
FlashNum (0);//停止错误-在"Ack"时闪烁
sAckhold_DS++;//计算此 DS
if (sAckhold_ds >= ACK_hold_ds)//if "Ack" PB 保持足够长的时间
{
sAckHoldFlag = 1;//设置"Ack-hold-down"标志
sAckhold_ds = 0;//清除"Ack Holddown"计时器
}
}
否则//但如果未按下"Ack"
{
sAckNowFlag = 1;//标记此条件
sAckhold_ds = 0;//清除"Ack Holddown"计时器
}
}