在 MSP430 代码中使用全局变量
Using global variables in MSP430 code
我目前正在学习使用 MSP430g2553 的微处理器课程,我注意到我们教授编写的示例 C 代码大量使用了全局变量。
这背后的原因是什么?
(我总是被告知只有在绝对必要时才使用全局变量,所以我假设微处理器的结构使它们成为必要。)
更新:我忘记包含示例代码。这是我们在 class:
中看到的早期示例 c 程序
#include <msp430g2553.h>
volatile unsigned int blink_interval; // number of WDT interrupts per blink of LED
volatile unsigned int blink_counter; // down counter for interrupt handler
int main(void) {
// setup the watchdog timer as an interval timer
WDTCTL =(WDTPW + // (bits 15-8) password
// bit 7=0 => watchdog timer on
// bit 6=0 => NMI on rising edge (not used here)
// bit 5=0 => RST/NMI pin does a reset (not used here)
WDTTMSEL + // (bit 4) select interval timer mode
WDTCNTCL + // (bit 3) clear watchdog timer counter
0 // bit 2=0 => SMCLK is the source
+1 // bits 1-0 = 01 => source/8K
);
IE1 |= WDTIE; // enable the WDT interrupt (in the system interrupt register IE1)
P1DIR |= 0x01; // Set P1.0 to output direction
// initialize the state variables
blink_interval=67; // the number of WDT interrupts per toggle of P1.0
blink_counter=blink_interval; // initialize the counter
_bis_SR_register(GIE+LPM0_bits); // enable interrupts and also turn the CPU off!
}
// ===== Watchdog Timer Interrupt Handler =====
// This event handler is called to handle the watchdog timer interrupt,
// which is occurring regularly at intervals of about 8K/1.1MHz ~= 7.4ms.
interrupt void WDT_interval_handler(){
if (--blink_counter==0){ // decrement the counter and act only if it has reached 0
P1OUT ^= 1; // toggle LED on P1.0
blink_counter=blink_interval; // reset the down counter
}
}
ISR_VECTOR(WDT_interval_handler, ".int10")
根据MSP430资料sheet,它有高达512KB的闪存(用于程序存储)和66KB的RAM(用于数据存储)。由于您没有提供任何代码示例,因此您的教授很可能希望以最佳方式使用 ram。可能声明了一些函数,使用相同的数据作为输入,或者他只是在全局区域中定义了变量,而没有考虑任何性能问题并且完全是无意的(我不这么认为,但这也是一种可能性)。您应该注意的重点是,始终尝试以有效的方式使用这些有限的资源,尤其是在嵌入式设备上。
微控制器没有什么特别需要全局变量的。全局变量在嵌入式系统中是不受欢迎的,原因与在其他系统中不受欢迎的原因相同。 Jack Ganssle 在他的 blog post on globals.
中解释了原因
是的,微控制器的 RAM 数量有限,但这不是随意使用全局变量的借口。
问问你的老师为什么 he/she 使用全局变量。也许您的讲师更关心的是教您有关微处理器的知识,而不是展示良好的软件设计。
我目前正在学习使用 MSP430g2553 的微处理器课程,我注意到我们教授编写的示例 C 代码大量使用了全局变量。
这背后的原因是什么?
(我总是被告知只有在绝对必要时才使用全局变量,所以我假设微处理器的结构使它们成为必要。)
更新:我忘记包含示例代码。这是我们在 class:
中看到的早期示例 c 程序#include <msp430g2553.h>
volatile unsigned int blink_interval; // number of WDT interrupts per blink of LED
volatile unsigned int blink_counter; // down counter for interrupt handler
int main(void) {
// setup the watchdog timer as an interval timer
WDTCTL =(WDTPW + // (bits 15-8) password
// bit 7=0 => watchdog timer on
// bit 6=0 => NMI on rising edge (not used here)
// bit 5=0 => RST/NMI pin does a reset (not used here)
WDTTMSEL + // (bit 4) select interval timer mode
WDTCNTCL + // (bit 3) clear watchdog timer counter
0 // bit 2=0 => SMCLK is the source
+1 // bits 1-0 = 01 => source/8K
);
IE1 |= WDTIE; // enable the WDT interrupt (in the system interrupt register IE1)
P1DIR |= 0x01; // Set P1.0 to output direction
// initialize the state variables
blink_interval=67; // the number of WDT interrupts per toggle of P1.0
blink_counter=blink_interval; // initialize the counter
_bis_SR_register(GIE+LPM0_bits); // enable interrupts and also turn the CPU off!
}
// ===== Watchdog Timer Interrupt Handler =====
// This event handler is called to handle the watchdog timer interrupt,
// which is occurring regularly at intervals of about 8K/1.1MHz ~= 7.4ms.
interrupt void WDT_interval_handler(){
if (--blink_counter==0){ // decrement the counter and act only if it has reached 0
P1OUT ^= 1; // toggle LED on P1.0
blink_counter=blink_interval; // reset the down counter
}
}
ISR_VECTOR(WDT_interval_handler, ".int10")
根据MSP430资料sheet,它有高达512KB的闪存(用于程序存储)和66KB的RAM(用于数据存储)。由于您没有提供任何代码示例,因此您的教授很可能希望以最佳方式使用 ram。可能声明了一些函数,使用相同的数据作为输入,或者他只是在全局区域中定义了变量,而没有考虑任何性能问题并且完全是无意的(我不这么认为,但这也是一种可能性)。您应该注意的重点是,始终尝试以有效的方式使用这些有限的资源,尤其是在嵌入式设备上。
微控制器没有什么特别需要全局变量的。全局变量在嵌入式系统中是不受欢迎的,原因与在其他系统中不受欢迎的原因相同。 Jack Ganssle 在他的 blog post on globals.
中解释了原因是的,微控制器的 RAM 数量有限,但这不是随意使用全局变量的借口。
问问你的老师为什么 he/she 使用全局变量。也许您的讲师更关心的是教您有关微处理器的知识,而不是展示良好的软件设计。