new_os
new_os
这家伙很懒,什么也没写!

注册于 8年前

回答
7
文章
0
关注者
0

发布于8年前

[s:157] 因为没有使用过git,不知怎么样pull request

发布于8年前

ymodem貌似也有点问题,如果超级终端传输设置为1KB的数据包大小,那么接收第一个包的时候就可能出问题,现在的程序只识别第一个包是128字节的包大小,如果第一个包是1024大小的就会出错,我在程序里面加了个变量,修改了下程序使之可以同时支持2个包大小,红色标记为修改过的。[attach]2720[/attach]

发布于8年前

一直没找到zmodem的通信协议,通过跟踪还是发现问题所在,如果传输的是二进制文件,如果文件里面有连续的0x18这样的数据,就可能会导致数据传输失败,红色部分就是检测到大于5个0x18就退出
这个算是一个bug吗,还是说zmodem只用于传输文本文件,也就是数据都是大于0x20的可见字符,这个问题怎么解?

  1. rt_int16_t zget_header(rt_uint8_t *hdr)
  2. {
  3. rt_int16_t c,prev_char;
  4. rt_uint32_t bit;
  5. rt_uint16_t get_can,step_out;
  6. bit = get_device_baud(); /* get console baud rate */
  7. Rxframeind = header_type = 0;
  8. step_out = 0;
  9. prev_char = 0xff;
  10. for (;;)
  11. {
  12. c = zread_line(100);
  13. switch(c)
  14. {
  15. case 021:
  16. case 0221:
  17. if (prev_char == CAN) break;
  18. if (prev_char == ZCRCW) goto start_again;
  19. break;
  20. case RCDO:
  21. goto end;
  22. case TIMEOUT:
  23. if (prev_char == CAN) break;
  24. if (prev_char == ZCRCW)
  25. {
  26. c = -RT_ERROR; goto end;
  27. }
  28. goto end;
  29. case ZCRCW:
  30. if (prev_char == CAN) goto start_again;
  31. break;
  32. case CAN:

get_can:
if (++get_can > 5)
{
c = ZCAN; goto end;
}

  1. break;
  2. case ZPAD:
  3. if (prev_char == CAN) break;
  4. if (prev_char == ZCRCW) goto start_again;
  5. step_out = 1;
  6. break

发布于8年前

看返回的数据,感觉是退出了rz

  1. static rt_err_t zrec_files(struct zfile *zf)
  2. {
  3. rt_uint8_t *rxbuf;
  4. rt_err_t res = -RT_ERROR;
  5. zinit_parameter();
  6. rxbuf = rt_malloc(RX_BUFFER_SIZE*sizeof(rt_uint8_t));
  7. if (rxbuf == RT_NULL)
  8. {
  9. rt_kprintf("rxbuf: out of memory
  10. ");
  11. return -RT_ERROR;
  12. }
  13. rt_kprintf("
  14. rz: ready...
  15. "); /* here ready to receive things */
  16. if ((res = zrec_init(rxbuf,zf))!= RT_EOK)
  17. {
  18. rt_kprintf("receive init failed
  19. ");
  20. rt_free(rxbuf);
  21. return -RT_ERROR;
  22. }
  23. res = zrec_file(rxbuf,zf);
  24. if (res == ZFIN)
  25. {
  26. rt_free(rxbuf);
  27. return RT_EOK; /* if finish session */
  28. }
  29. else if (res == ZCAN)
  30. {
  31. rt_free(rxbuf);
  32. return ZCAN; /* cancel by sender */
  33. }
  34. else
  35. {
  36. zsend_can();

程序返回ZCAN就退出了

发布于8年前

已经找到使用方法了,如果打开RT_USING_FINSH情况下把zmodem文件夹下的代码加入到工程里面直接编译,

我用的keil编译的,开始finsh里面始终没有rz,sz命令出来,原来是程序没有显式调用rz,sz函数,被优化掉了,

在keil的linker选项里面Misc controls添加—keep=zstart.o(*)选项禁止优化这段代码就可以了

发布于8年前

经过程序跟踪,发现确实是自己代码问题,分配了一块内存,分配后做了4字节地址对齐操作,多分配8个字节做地址对齐就OK了,感谢“bernard ”及“aozima ”

发布于8年前

这个已经是定义了的页面大小,确实加载了elm文件系统,mkfs提示成功,挂载文件系统成功
测试mkdir时出错,跟踪进去发现是内存分配失败,CPU是GD32F103,64K内存,现在没有加载很多程序,堆内存才分配了2K多
用list_thread看堆栈貌似没有溢出

  1. | /
  2. - RT - Thread Operating System
  3. / | 2.1.0 build Nov 18 2016
  4. 2006 - 2015 Copyright by rt-thread team
  5. finsh>>W25Q128BV detection
  6. flash0 mount to /.
  7. finsh>>mkdir("/my_dir")
  8. -1, 0xffffffff
  9. finsh>>list_thread()
  10. thread pri status sp stack size max used left tick error
  11. -------- ---- ------- ---------- ---------- ---------- ---------- ---
  12. tidle 0x1f ready 0x00000050 0x00000100 0x00000050 0x0000001b 000
  13. tshell 0x14 ready 0x0000008c 0x00000400 0x000002a8 0x00000006 000
  14. init 0x1d ready 0x00000088 0x00000400 0x00000208 0x00000012 -02
  15. 0, 0x00000000
  16. finsh>>

init线程错误代码是-2,线程貌似又可以运行,这个是什么错误?

  1. /* SECTION: DFS???????? */
  2. #define RT_USING_DFS
  3. #define RT_USING_DFS_ELMFAT
  4. /* ?????????¨????°???????FatFs???é */
  5. #define RT_DFS_ELM_REENTRANT
  6. /* ?????????í?¨?????????÷?????????? */
  7. #define RT_DFS_ELM_DRIVES 1
  8. #define RT_DFS_ELM_USE_LFN 0
  9. #define RT_DFS_ELM_CODE_PAGE 437
  10. #define RT_DFS_ELM_MAX_LFN 255
  11. /* ?????í??×??ó?????ó?? */
  12. #define RT_DFS_ELM_MAX_SECTOR_SIZE 4096
  13. /* °?×°????????????×??ó???? */
  14. #define DFS_FILESYSTEMS_MAX 1
  15. /* ?ò????????×??ó???? */
  16. #define DFS_FD_MAX 4

回到
顶部

发布
问题

投诉
建议