注释
贡献者
|
我相信这是为了防止串行中断在清除此变量时触发和设置此变量。 |
|
对于所有只是写入而不是读取/修改的功能,不需要它,写入不能被中断,因此串行中断将在之前或之后发生,无论 |
贡献者
|
@langwadt: 是的,可能吧,但它在那里并没有什么坏处。主要是防御性编程。无论哪种方式,由于 sei() 和 cli() 被编译成单个汇编指令,删除它不会超过几个字节的闪存和几个周期。 作为旁注,我确实找到了一种方法来通过更改默认设置的复制方式来释放大约 100 字节左右的闪存。不多,但如果你真的需要额外的空间,最好还是选择 Mega2560 版本。 |
作者
|
实际上,我在 uno 上使用 102.4% 的闪存,可能需要添加 0.2%。没有完整的选项,它是 95%。最大的惊喜是 ram 。将 32 位更改为 24 位将其从超过 105% 更改为 75%。这为 6 轴。也许我使用了错误的固件,因为有 uno 和 mega 版本。一个很大的惊喜是新的 M56 操作码,因为它通常基本上用作继电器输出。Il lunedì 21 maggio 2018,langwadt <notifications@github.com> ha scritto:
|
|
@chamnit我很好奇,所以我尝试更改仅写入的四个功能,它节省了 30 个字节 |
贡献者
|
@langwadt: 谢谢。30 个字节并不多。有趣的是,我不认为我以前有大部分额外的 SREG 代码,但是有人在这里发帖强烈坚持我把它放进去。没有他们这是错误的。不确定谁是对的,但无论如何,没有证据表明它在做任何坏事。如果将其删除,则需要进行大量测试以确保它不会产生任何新问题。 |
作者
|
我建议在 serial.c 案例中删除它 CMD_DEBUG_REPORT: {uint8_t sreg = SREG; cli(); 位真(sys_rt_exec_debug,EXEC_DEBUG_REPORT);SREG = sreg;} 中断; 并将其替换为 case CMD_DEBUG_REPORT: bit_true(sys_rt_exec_debug,EXEC_DEBUG_REPORT); 休息; 由于代码在中断代码内部,全局中断位总是被清除,这进一步增加了可移植性,删除了外部定义的处理器相关的特殊代码。2018-05-21 21:43 GMT+02:00,Sonny Jeon <notifications@github.com>:
|
贡献者
|
再次感谢,幸好这段代码只用在我的开发流程中。这可能应该完全删除。 |


嗨,查看代码,启用它在 avr 目标上编译超过 32k 的大部分功能(N 行、coreXY 等) 。
现在查看代码,我看到了这种类型的函数,它只更新 volatile 8 位变量。
void system_clear_exec_motion_overrides() {
uint8_t sreg = SREG;
cli();
sys_rt_exec_motion_override = 0;
SREG = sreg;
}
由于veriable是volatile和atomar,这个函数和中断阻塞开销的原因是什么?
问候
危机