开源改变世界

uno r2 上的串口坏了 #173

推推 grbl 2年前 (2023-01-21) 92次浏览

关闭
mcclurem 打开了这个问题 2013 年 1 月 29 日 · 15条评论
关闭

uno r2 上的串口坏了#173

mcclurem 打开了这个问题 2013 年 1 月 29 日 · 15条评论

注释

uno r2 上的串口坏了 #173

我有一个运行 0.6 的 uno r2 没问题。升级到 0.7 或 0.8,串行端口流垃圾。确定范围后,它会以 37Hz 的频率周期性地发出 630us 的低脉冲。我不知道 wtf 在这里。

uno r2 上的串口坏了 #173
成员

奇怪的。在 v0.6、v0.7 和 v0.8 之间,对串行协议进行了大量调整,但我有一个 Uno(不确定 rev 版本)并且一切正常。所以我认为这可能是某个地方的设置问题。您是否通过断开 USB 线以外的所有设备来消除任何外部影响?尝试过 Wiki 中概述的闪烁方法吗?有关您正在做什么以及如何帮助我们诊断您的问题的更多信息。

uno r2 上的串口坏了 #173
作者

我正在使用 avrisp MK11。它在闪烁后读回闪光并说一切都很好。我尝试手动擦除 eeprom,然后重新刷新,但没有成功。有趣的是,无论我使用预编译的二进制文件还是自己构建,它都会在 0.6/0.7 版本拆分时中断。尝试使用屏蔽打开和关闭步进器连接和不连接。看起来它可能正在尝试从该引脚中取出一些东西?或者是 37Hz 的减慢方式?

要确定您的版本,请查看:
http ://arduino.cc/en/Main/ArduinoBoardUno

我只是有点不知所措

uno r2 上的串口坏了 #173
成员

当您使用 AVRmkii 闪存 Arduino 时,您使用什么命令标志?您是否尝试过“-D”标志?或者将 Arduino 引导加载程序(通过 IDE 完成)闪存到 Arduino,然后改用 Arduino USB 编程器?这可能会解决它。

我不在家看 Uno,有空的时候会去看。我很确定它是 Rev 1 或 Rev 2,但它们之间几乎没有区别。

不确定 37Hz 脉冲是什么,但绝对不是步进脉冲。

uno r2 上的串口坏了 #173
作者

尝试了引导加载程序的东西但没有成功。我试图进一步调试并注意到负脉冲 (630us) 的宽度取决于波特率。开始怀疑是否有办法让串行驱动程序变得无聊?

uno r2 上的串口坏了 #173
作者

进一步的调试显示串口变低可能是一个副作用,导致电路板以 37Hz 重置。我在 main 的第一行添加了一些微调,发现它正在重置。

对代码的进一步二进制搜索显示崩溃发生在执行通过“protocol_execute_startup”调用的“settings_read_startup_line”调用的“memcpy_from_eeprom_with_checksum”期间

uno r2 上的串口坏了 #173
成员

有趣的。无法确定地告诉您 Arduino 发生了什么。“settings_read_startup_line”仅适用于 v0.8c+。您的 Arduino 的 EEPROM 或 EEPROM 代码似乎导致了崩溃。一般来说,EEPROM 设置的操作自 v0.6 以来没有太大变化。或者它可能是从特定事件序列中突然出现的一些模糊错误。很难说。我会环顾四周,看看能不能发现什么,但像这样的东西很难查明。

回到家,我确实有一个 rev1 Uno,所以我无法进行同类比较。但是,我有一种感觉,至少有几十个或更多的用户拥有一个rev2 Uno,并且没有任何这样的报道案例。这可能是一个孤立的问题。如果您发现任何新线索,请告诉我。我也会这样做。

uno r2 上的串口坏了 #173
贡献者

我都用过,基本上没有问题。我看到了几个问题,主要是关于未枚举的设备。通常我会使用 ISP 重新刷新 arduino 引导加载程序,并通过 arduino 协议 avrdude 十六进制。

uno r2 上的串口坏了 #173

在带有 Win7 的 Arduino Nano 3.0 上也是如此。
当使用 avr-gcc 4.6.2(来自 AVR-Studio 6.0)编译时,我会定期重新启动。
使用 avr-gcc 4.3.3 (WinAVR20100110) 编译的相同代码很好!

uno r2 上的串口坏了 #173
成员

这很不幸。听起来像是某个地方重复出现的问题。但至少我们还有另一条线索。@sebbra您是否在 v0.7 和 v0.8 中看到了相同的行为,但在 v0.6 中没有看到@mcclurem拥有?这样做将不胜感激。这将缩小我需要在代码中查找的范围。

uno r2 上的串口坏了 #173

我还看到了 AVRStudio4 和 AtmelStudio6 编译代码之间的行为变化(编译器和标准库差异)。有时编译器不会在其中一个或另一个中发出警告 – 然后就是整个’const’的东西。我发现在内存中乱写问题的地方是在 memsets 中。我先检查一下。

uno r2 上的串口坏了 #173

我已经用 edge 的代码试过了,但我明天会尝试 v0.6 和 v0.8。

uno r2 上的串口坏了 #173

我试过 grbl:
v0.9a v0.8c v0.7d v0.6b 和 v0.51。

我使用过 avr-gcc:
4.3.2(WinAVR20081205)、4.3.3(WinAVR20100110)、4.5.1(AVR-Studio 5.0)、4.6.2(AVR-Studio 6.0) 和 4.7.2(MHV AVR 工具)。

Grbl 0.51 和 0.6b 有 avr-gcc > 4.3.3 的编译错误,因为 delay.h…..

使用来自 AVR-Studio 6.0 的 avr-gcc 4.6.2,我重新启动了所有版本。

所有其他组合都可以。

uno r2 上的串口坏了 #173
成员

太感谢了@sebbra. 看来 avr-gcc 4.6.2 肯定有一些东西。我会看看 memsets 作为@aldenhart建议。如果有人对此有任何其他想法,请告诉我。没有什么真的被完全排除了。

顺便问一下,我们页面上的预编译固件是怎么做的?特别是 v0.6b 到 v0.8c?不确定 v0.6b 是用什么编译的(可能是旧的 Arduino IDE avr-gcc 版本)。v0.7d+ 全部使用 Arduino IDE v1.0+ 和 avr-gcc 4.3.2(我认为)编译。

uno r2 上的串口坏了 #173
作者

有趣的信息。我一直在用 4.7.0 编译。另外,我想我测试了您页面上的二进制文件并遇到了同样的问题。我今天可以再检查一次。我会尝试看看是否使用 arduino IDE gcc 修复了它。我很好奇为什么我们会在特定版本的 GCC 中看到这个问题。是否有补丁集可以修复/破坏某些东西?
@sebbra– 你能在 4.7.2 和 4.6.2 上编译 8.c 并比较 memcpy_from_eeprom_with_checksum 中的 asm 吗?

uno r2 上的串口坏了 #173

@mcclurem– 抱歉我上周工作很忙..

它们并没有太大的不同,它们使用不同的寄存器,但是它们非常相似。


; GNU C (AVR_8_bit_GNU_Toolchain_3.4.0_663) 版本 4.6.2 (avr)
;由 GNU C 版本 4.6.1、GMP 版本 5.0.2、MPFR 版本 3.0.0、MPC 版本 0.9 编译
;GGC 启发式:–param ggc-min-expand=100 –param ggc-min-heapsize=131072
; 通过的选项:-fpreprocessed eeprom.i -mmcu=atmega328p
;-auxbase-strip eeprom.o -Os -Wall -ffunction-sections -fverbose-asm
;启用的选项:-fauto-inc-dec -fbranch-count-reg -fcaller-saves
;-fcombine-stack-adjustments -fcommon -fcompare-elim -fcprop-registers
;-fcrossjumping -fcse-follow-jumps -fdefer-pop -fdevirtualize
; -fdwarf2-cfi-asm -fearly-inlining -feliminate-unused-debug-types
;-fexpensive-optimizations -fforward-propagate -ffunction-cse
; -ffunction-sections -fgcse -fgcse-lm -fguess-branch-probability -fident
; -fif-conversion -fif-conversion2 -findirect-inlining -finline
; -finline-functions -finline-functions-called-once
; -finline-small-functions -fipa-cp -fipa-profile -fipa-pure-const
;-fipa-reference -fipa-sra -fira-share-save-slots
;-fira-share-spill-slots -fivopts -fkeep-static-consts
;-fleading-underscore -fmath-errno -fmerge-constants
; -fmerge-debug-strings -fmove-loop-invariants -fomit-frame-pointer
;-foptimize-register-move -foptimize-sibling-calls -fpartial-inlining
;-fpeephole -fpeephole2 -fprefetch-loop-arrays -freg-struct-return
; -fregmove -freorder-blocks -freorder-functions -frerun-cse-after-loop
; -fsched-critical-path-heuristic -fsched-dep-count-heuristic
;-fsched-group-heuristic -fsched-interblock -fsched-last-insn-heuristic
; -fsched-rank-heuristic -fsched-spec -fsched-spec-insn-heuristic
;-fsched-stalled-insns-dep -fshow-column -fsigned-zeros
;-fsplit-ivs-in-unroller -fsplit-wide-types -fstrict-aliasing
;-fstrict-overflow -fstrict-volatile-bitfields -fthread-jumps
; -ftoplevel-reorder -ftrapping-math -ftree-bit-ccp
; -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copy-prop
;-ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse
; -ftree-forwprop -ftree-fre -ftree-loop-if-convert -ftree-loop-im
;-ftree-loop-ivcanon -ftree-loop-optimize -ftree-parallelize-loops=
; -ftree-phiprop -ftree-pre -ftree-pta -ftree-reassoc -ftree-scev-cprop
;-ftree-sink -ftree-slp-vectorize -ftree-sra -ftree-switch-conversion
;-ftree-ter -ftree-vect-loop-version -ftree-vrp -funit-at-a-time
;-fverbose-asm -fzero-initialized-in-bss

.section .text.memcpy_from_eeprom_with_checksum,”ax”,@progbits
.global memcpy_from_eeprom_with_checksum
.type memcpy_from_eeprom_with_checksum,@function
memcpy_from_eeprom_with_checksum:
推r8;
推 r9 ;
推 r10 ;
推 r11 ;
推 r12 ;
推 r13 ;
推 r14 ;
推 r15 ;
推 r16 ;
推 r17 ;
推 r28 ; /
* prologue: function //
frame size = 0 //
stack size = 11 .L__stack_usage
= 11
movw r10,r24 ; 目的地,目的地
movw r12,r22 ; 来源,来源
movw r14,r20 ; 尺寸,尺寸
movw r16,r20 ; 尺寸,尺寸
movw r24,r22 ; 源, 源
ldi r28,lo8(0) ; 校验和,
rjmp .L17 ;
.L19:
movw r8,r24 ; 源,源
sec
adc r8,zero_reg ;源
adc r9, zero_reg ; 源
调用 eeprom_get_char ;
测试 r28 ; 校验和
brne .L21 ; ,
移动 r18, r28 ; iftmp.1, 校验和
clr r19 ; iftmp.1
sbrc r18,7 ; iftmp.1
com r19 ; iftmp.1
clr r18 ; iftmp.1
lsl r19 ; iftmp.1 角色
r18 ;iftmp.1
clr r19 ; iftmp.1
rjmp .L18 ;
.L21:
ldi r18,lo8(1) ; iftmp.1,
ldi r19,hi​​8(1) ; iftmp.1,
.L18:
mov r28,r24 ; 校验和,数据
添加 r28,r18 ;校验和,iftmp.1
movw r30,r10;, 目的地
st Z+, r24 ; MEM[base: destination_1, offset: 0B], data
movw r10,r30 ; 目的地,
subi r16,lo8(-(-1)) ; 大小,
sbci r17,hi8(-(-1)) ; 尺寸,
movw r24,r8 ; 来源,来源
.L17:
cp r16,zero_reg ;尺寸
cpc r17, zero_reg ; 尺寸
brne .L19 ; ,
移动 r24, r14 ; , 尺寸
加 r24,r12 ; , 源
adc r25, r13 ; , 源
调用 eeprom_get_char ;
ldi r18,lo8(1) ; tmp67,
ldi r19,hi​​8(1) ; tmp67,
cp r28,r24;校验和,
breq .L20;,
ldi r18,lo8(0) ; tmp67,
ldi r19,hi​​8(0) ; tmp67,
.L20:
movw r24,r18 ; ,
/
尾声开始 */
pop r28 ;
弹出 r17 ;
弹出 r16 ;
弹出 r15 ;
弹出 r14 ;
弹出 r13 ;
弹出 r12 ;
弹出 r11 ;
弹出 r10 ;
弹出 r9 ;
弹出 r8 ;
ret
.size memcpy_from_eeprom_with_checksum,.-memcpy_from_eeprom_with_checksum


; GNU C (GCC) 版本 4.7.2 (avr)
;由 GNU C 版本 4.7.0、GMP 版本 5.0.2、MPFR 版本 3.1.0、MPC 版本 0.8.2 编译
;GGC 启发式:–param ggc-min-expand=100 –param ggc-min-heapsize=131072
; 通过的选项:-fpreprocessed eeprom.i -mmcu=atmega328p
;-auxbase-strip eeprom.o -Os -Wall -ffunction-sections -fverbose-asm
;启用的选项:-fauto-inc-dec -fbranch-count-reg -fcaller-saves
;-fcombine-stack-adjustments -fcommon -fcompare-elim -fcprop-registers
;-fcrossjumping -fcse-follow-jumps -fdebug-types-section -fdefer-pop
; -fdevirtualize -fdwarf2-cfi-asm -fearly-inlining
;-feliminate-unused-debug-types -fexpensive-optimizations
; -fforward-propagate -ffunction-cse -ffunction-sections -fgcse -fgcse-lm
;-fgnu-runtime -fguess-branch-probability -fident -fif-conversion
; -fif-conversion2 -findirect-inlining -finline -finline-atomics
;-finline-functions -finline-functions-called-once
; -finline-small-functions -fipa-cp -fipa-profile -fipa-pure-const
;-fipa-reference -fipa-sra -fira-share-save-slots
;-fira-share-spill-slots -fivopts -fkeep-static-consts
;-fleading-underscore -fmath-errno -fmerge-constants
; -fmerge-debug-strings -fmove-loop-invariants -fomit-frame-pointer
;-foptimize-register-move -foptimize-sibling-calls -fpartial-inlining
;-fpeephole -fpeephole2 -fprefetch-loop-arrays -freg-struct-return
; -fregmove -freorder-blocks -freorder-functions -frerun-cse-after-loop
;-fsched-critical-path-heuristic -fsched-dep-count-heuristic
;-fsched-group-heuristic -fsched-interblock -fsched-last-insn-heuristic
; -fsched-rank-heuristic -fsched-spec -fsched-spec-insn-heuristic
;-fsched-stalled-insns-dep -fshow-column -fshrink-wrap -fsigned-zeros
;-fsplit-ivs-in-unroller -fsplit-wide-types -fstrict-aliasing
;-fstrict-overflow -fstrict-volatile-bitfields -fthread-jumps
; -ftoplevel-reorder -ftrapping-math -ftree-bit-ccp
; -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copy-prop
;-ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse
; -ftree-forwprop -ftree-fre -ftree-loop-if-convert -ftree-loop-im
;-ftree-loop-ivcanon -ftree-loop-optimize -ftree-parallelize-loops=
; -ftree-phiprop -ftree-pre -ftree-pta -ftree-reassoc -ftree-scev-cprop
;-ftree-sink -ftree-slp-vectorize -ftree-sra -ftree-switch-conversion
;-ftree-tail-merge -ftree-ter -ftree-vect-loop-version -ftree-vrp
;-funit-at-a-fverbose-asm -fzero-initialized-in-bss

.section .text.memcpy_from_eeprom_with_checksum,”ax”,@progbits
.global memcpy_from_eeprom_with_checksum
.type memcpy_from_eeprom_with_checksum,@function
memcpy_from_eeprom_with_checksum:
推r9;
推 r10 ;
推 r11 ;
推 r12 ;
推 r13 ;
推 r14 ;
推 r15 ;
推 r16 ;
推 r17 ;
推 r28 ;
推 r29 ; /
* prologue: function //
frame size = 0 //
stack size = 11 .L__stack_usage
= 11
movw r16,r22 ; 来源,来源
movw r14,r20 ; 尺寸,尺寸
movw r12,r24 ; D.1497, 目的地
添加 r12,r20 ; D.1497,大小
adc r13,r21;D.1497,尺寸
movw r28,r24;目的地,目的地
mov r9,零注册 ;校验和
movw r10,r22 ; tmp78,源
子 r10,r24;tmp78,目标
sbc r11,r25;tmp78, 目的地
rjmp .L20 ;
.L22:
调用 eeprom_get_char ;
cpse r9, zero_reg ; 校验和,
rjmp.L24;
mov r20,r9 ; 校验和,校验和
clr r21 ;校验和
sbrc r20,7 ; 校验和
com r21 ; 校验和
mov r18,r21 ; ,
卷 r18 ;
clr r18 ;
卷 r18 ;
rjmp.L21;
.L24:
ldi r18,lo8(1) ; iftmp.1,
ldi r19,0 ; iftmp.1
.L21:
mov r9,r24 ; 校验和,数据
添加 r9,r18 ;校验和,iftmp.1
st Y+,r24; MEM[base: destination_1, offset: 0B], data
.L20:
movw r24,r28 ; D.1501, 目的地
添加 r24,r10 ; D.1501,tmp78
ADC r25,r11;D.1501,tmp78
cp r28,r12;目的地,D.1497
cpc r29,r13;目的地,D.1497
brne .L22;,
移动 r24, r14 ; , 尺寸
加 r24,r16 ; , 源
adc r25, r17 ; , 源
调用 eeprom_get_char ;
ldi r18,lo8(1) ; tmp73,
ldi r19,0 ;
cp r9,r24 ; 校验和,
breq .L23;,
ldi r18,0 ; tmp73
ldi r19,0 ;
.L23:
movw r24,r18 ; ,
/
结语开始*/
弹出 r29 ;
弹出 r28 ;
弹出 r17 ;
弹出 r16 ;
弹出 r15 ;
弹出 r14 ;
弹出 r13 ;
弹出 r12 ;
弹出 r11 ;
弹出 r10 ;
弹出 r9 ;
ret
.size memcpy_from_eeprom_with_checksum,.-memcpy_from_eeprom_with_checksum


喜欢 (0)