试试下面的代码
- 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(); // 长循环中喂狗
- }
- }
- }
-
- // 其他任务...
- }
- }
|