注释
贡献者
|
确定吗?eeprom_put_char() 函数直接来自 Atmel 框架。我相信这是他们代码的直接副本。 |
作者
|
是的,在文件eeprom.c的第79行,eeprom_put_char中的第一个函数调用是cli();这是在没有事先调用 uint8_t sreg = SREG 的情况下调用的;就像您在代码的其他地方所做的那样。eeprom_put_char.c 中的最后一个调用是 sei();而不是 SREG = sreg; 就像在代码的其他地方所做的那样。
|
贡献者
|
@scottnortman: 你是说 Atmel Software Framework 中的这个函数有错误吗? |
作者
|
是的,看来是这样。
|
|
我将 CRITICAL_SECTION_START 和 CRITICAL_SECTION_END 放在 serial_init 和 settings_init 函数的开头和结尾,并使用 avr eeprom_update_byte 和 eeprom_read_byte 作为 eeprom 函数这在 nuts_bolds.h 中定义如下 cli(); #define CRITICAL_SECTION_END SREG = _sreg; #endif //CRITICAL_SECTION_START 它在串行内部也是必需的,因为它访问 16 位变量并且 avr 使用全局影子寄存器进行 16 位访问,仅当有 i2c 支持时才重要。2018-05-18 19:05 GMT+02:00,scottnortman <notifications@github.com>:
|
贡献者
|
@cri-s: 仅供参考,这个抽象已经存在于 ARM 未发布的重写中。除非有错误要修复,否则我不会对此代码库进行任何更改。 |
作者
|
嗨,明白了。我实际上正在为 Cypress PSOC 6 开发一个端口,它是一个 cortex m4 + m0。
|


嗨,
我注意到在 eeprom_put_char 函数中,全局中断被禁用(第 79 行),调用 cli() 时不保留 SREG 的先前状态,并且在函数结束时调用 sei()。因此,这将启用全局中断,即使它们在第 79 行的 cli() 调用中未启用。
不确定这是否重要,但只是想我会提到它……