试试下面的代码
volatile uint8_t mark = 0; // 添加volatile修饰
ISR(TIMER1_OVF_vect) {
// 重装初值20ms
if(PORTA != pastPORTA) {
uint8_t tmp[15]; // 使用临时缓冲区
for(uint8_t i=0; i<15; i++) {
tmp[i] = 某逻辑计算后的值;
}
// 禁用中断保护临界区
cli();
for(uint8_t i=0; i<15; i++) {
table[i] = tmp[i];
}
mark = 1;
sei();
}
}
int main(void) {
while(1) {
wdt_reset(); // 喂狗
if(mark) {
cli();
uint8_t local_mark = mark;
mark = 0;
sei();
if(local_mark) {
for(uint8_t i=0; i<15; i++) {
while(!UART_ready_to_send()); // 等待发送就绪
Uartsend_oneBit(table[i]);
wdt_reset(); // 长循环中喂狗
}
}
}
// 其他任务...
}
}
|