[讨论] helper2416_rawos_ping测试

lyzhangxiang   2014-8-28 09:56 楼主
今天又试了一下ping测试,我在之前的lwip移植帖子中提出了一些疑问,有个raw-os上面的ping测试不通,今天我又按照我的方式进行了一下测试,竟然能通,唯一的区别是今天使用的环境和之前的不一样包括(电脑、MDK和rawos源码包--都是git获取,不保证一致)。

当初不通我还在想rawos提供的网络ping不通,这么奇怪。。。现在总算通了,贴上测试代码
  1. void init_task(void *arg)
  2. {

  3.         //GPB0 HIGH to avoid buzzer noise
  4.         GPBCON_REG &= ~(1 << 1);
  5.         GPBCON_REG |= (1 << 0);
  6.         GPBDAT_REG |= (1 << 0);
  7.        
  8.         raw_page_init((RAW_VOID *)HEAP_ADDRESS_START, (RAW_VOID *)HEAP_ADDRESS_END);
  9.         raw_malloc_init();

  10.         raw_semaphore_create(e_sem_lock, "ethernet sem lock", 1);
  11.        
  12.         timer_0_init();       
  13.         Uart_0_Init();
  14.        
  15.         print_cpuinfo();

  16.         /*
  17.         register_task_stack_command();
  18.         rsh_register_command(&iic_shell_cmd, &iic_shell_listitem);
  19.         rsh_register_command(&xTestDemoCommand, &test_register_item);
  20.         rsh_register_command(&xWatchdogCommand, &xWatchdogRegisteredCommands);
  21.         rsh_register_command(&tftp, &tftp_item);
  22.         rsh_register_command(&spi_shell_cmd, &spi_shell_listitem);
  23.         rsh_register_command(&xHsmmcCommand, &xHsmmcRegisteredCommands);
  24.         rsh_register_command(&xFatfsCommand, &xFatfsRegisteredCommands);
  25.         rsh_register_command(&pwmopen, &pwmopen_item);
  26.         rsh_register_command(&pwmclose,&pwmclose_item);
  27.         rsh_register_command(&yaffs_shell_cmd,&yaffs_shell_item);
  28.         rsh_register_command(&usbd_shell_cmd,&usbd_shell_item);       
  29.         rsh_register_command(&wave_shell_cmd,&wave_shell_item);       
  30.         rsh_register_command(&ugfx_shell_cmd,&ugfx_shell_item);       
  31.         rsh_register_command(&reboot_shell_cmd,&reboot_shell_item);       
  32.        
  33.         rsh_register_command(&xUcguiCommand, &xUcguiRegisteredCommands);
  34.         */
  35.        
  36.        
  37.         //tftp_client();
  38.        
  39.         lwip_ping_test();
  40.        
  41.         //raw_task_create(&shell_task_obj, (RAW_U8  *)"testtask", 0,
  42.         //                IDLE_PRIORITY - 5, 0, shell_task_stack,
  43.         //                SHELL_TASK_STK_SIZE , shell_task, 1);

  44.        
  45.         raw_task_delete(raw_task_identify());

  46. }
修改这个函数中如上,可以使用tftp_client();或者lwip_ping_test();函数,注意修改里面的网络参数,和你的电脑到统一网段


  1. static void default_netif_add(void)
  2. {
  3.   IP4_ADDR(&tftp_client_gw, 192,168,2,254);
  4.   IP4_ADDR(&tftp_client_ipaddr, 192,168,2,100);
  5.   IP4_ADDR(&tftp_client_netmask, 255,255,255,0);

  6.   netif_set_default(netif_add(&tftp_client_netif, &tftp_client_ipaddr, &tftp_client_netmask,
  7.                               &tftp_client_gw, NULL, ethernetif_init, tcpip_input));
  8.   netif_set_up(&tftp_client_netif);
  9. }
测试结果如下

ping-test配置
ping-test.jpg

tftp-test配置
raw-os ping.jpg

大数据包ping测试
ping 1000.jpg

后面在移植一个网络速度测试的移植lwip/app下面有的。通过一段时间在ucos上面的组件移植测试等相关折腾,感觉有很多东西出了问题,不太好定位。尤其是ucos相关的,那些porting出了问题如何定位呢,参考了ucos官方的2410移植等。

底层东西有点多了,有时间要好好研究下uboot才能了解的更多了,很多细节不太懂,不想做一些应用的东西,有空在好好学习下吧。阶段性小结一下咯。


电工

回复评论 (8)

有时候,一件事情要重复几次才能真正验证其正确性。。。
My dreams will go on... http://www.jyxtec.com
点赞  2014-8-28 15:31
2416还是上linux有优势
努力
点赞  2014-8-28 15:34
引用: bruce_helen 发表于 2014-8-28 15:34
2416还是上linux有优势

上RAW-OS也是很有优势
点赞  2014-8-28 18:20
引用: spacexplorer 发表于 2014-8-28 15:31
有时候,一件事情要重复几次才能真正验证其正确性。。。

是啊,之前自己移植网络部分,不通就随手弄了下rawos的ping下看看稳定不,结果得出了不正确的结论。
晚上回来拿仿真器看了下lua移植,rawos下面也不太顺利,应该是堆栈问题。

start_debug.jpg

lua_load_debug.jpg


电工
点赞  2014-8-28 21:54
跟踪看了下死在了这个部分,有点奇怪的函数,c标准函数,好复杂的c使用方式,虚拟机很有水平,高手玩的东西啊,感叹
  1. /* default handling with long jumps */
  2. #define LUAI_THROW(L,c)                longjmp((c)->b, 1)
  3. #define LUAI_TRY(L,c,a)                if (setjmp((c)->b) == 0) { a }
  4. #define luai_jmpbuf                jmp_buf


与刺激的abort()和exit()相比,goto语句看起来是处理异常的更可行方案。不幸的是,goto是本地的:它只能跳到所在函数内部的标号上,而不能将控制权转移到所在程序的任意地点(当然,除非你的所有代码都在main体中)。
为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局部标号和goto作用。头文件申明了这些函数及同时所需的jmp_buf数据类型
原理非常简单:
1.setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp()返回0值。
2. 以后调用longjmp(j,r)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r或1(如果r设为0的话)。(记住,setjmp()不能在这种情况时返回0。)
通过有两类返回值,setjmp()让你知道它正在被怎么使用。当设置j时,setjmp()如你期望地执行;但当作为长跳转的目标时,setjmp()就从外面“唤醒”它的上下文。你可以用longjmp()来终止异常,用setjmp()标记相应的异常处理程序。

1.jpg

电工
点赞  2014-8-28 21:56
大家有了解这个标准c函数的么。。
电工
点赞  2014-8-28 21:57
引用: 洗澡哥 发表于 2014-8-28 18:20
上RAW-OS也是很有优势

很有优势啊,arm926 SOM还是比mcu复杂很多,最近问题多多啊,有时间多多交流
电工
点赞  2014-8-28 21:58
引用: lyzhangxiang 发表于 2014-8-28 21:58
很有优势啊,arm926 SOM还是比mcu复杂很多,最近问题多多啊,有时间多多交流

那优势必须的。我新手,刚开始学,多交流,嘿嘿
点赞  2014-8-28 23:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复