查看: 4009|回复: 3

高手帮看看SmartARM2300开发板附带程序一处问题

[复制链接]

该用户从未签到

发表于 2007-9-9 21:56:06 | 显示全部楼层 |阅读模式
分享到:
分析程序,发现几个问题(在程序中标注为//--):
(1)UDP服务器和客户端命名歧义,这个是小问题了;
(2)couter_byte问题。
因为局部变量couter_byte在前面定义时已初始化为5,所以,即使 if(rec_buffer[0]=='A')里面收到第一字节不等于A,应该也会执行下面while(couter_byte!=0)  内程序,但事实上却不会执行这里,为什么?
如果改动程序一处,如下:
  if(rec_buffer[0]=='A')
   couter_byte+=1;                    //--couter_byte在前面定义时已初始化为5

那么,按逻辑这里couter_byte应该为大于5的数,但实验测试却是发送1次!搞不明白了,请高手帮分析!

(3)这个问题比较蹊跷,如果把uint8 rec_buffer[100];定义为全局变量,那么用UDP测试工具测试时,发送请求数据后,板子的程序就出现异常,跳到:
Undefined
    B  Undefined
它作为全局变量也只是TaskD一个任务去改变它而已啊,没有重入问题吧?


附程序:
                            void TaskD(void *pdata)
{
uint8 add[36]={"ZLGMCUyhbabcdefghijklmnopqrstuvwxyz"};
uint8 add1[10]={"123456789"};
uint8 rec_buffer[100];
SOCKET s;
uint8 couter_byte=5;          //--注意此处初始化为5
//uint8 Temp;
int rec_coute,send_coute;
uint16 iii;
struct sockaddr servaddr,clientaddr;
 OSTimeDly(60);
 servaddr.sin_family=0;
 servaddr.sin_addr[0]=192;                //--设置客户端IP,但是命名为servaddr让人误解!
 servaddr.sin_addr[1]=168;
 servaddr.sin_addr[2]=0;
 servaddr.sin_addr[3]=55;
 servaddr.sin_port=1026; 
     OSTimeDly(60);
     s=*socket( 0, SOCK_DGRAM, UDP_PROTOCOL);
     clientaddr.sin_family=0;
 clientaddr.sin_addr[0]=192;
 clientaddr.sin_addr[1]=168;
 clientaddr.sin_addr[2]=0;
 clientaddr.sin_addr[3]=174;
 clientaddr.sin_port=1025; 
 iii=bind( (SOCKET * )&s, (struct sockaddr*)&clientaddr,sizeof(clientaddr));
    while (1)
    {
     rec_coute=recvfrom( s, rec_buffer, 100, 0, (struct sockaddr*)&servaddr, &iii );
 if(rec_coute>0)
 {
  if(rec_buffer[0]=='A')
   couter_byte=5;                    //--couter_byte在前面定义时已初始化为5
  else
   send_coute=sendto(s, rec_buffer, rec_coute, 0, (struct sockaddr*)&servaddr, sizeof(servaddr) );
 }


//--因为局部变量couter_byte在前面定义时已初始化为5,
//--所以,即使 if(rec_buffer[0]=='A')里面收到第一字节不等于A
//--应该也会执行下面while内程序,但事实上却不会执行这里,为什么?
 while(couter_byte!=0)           
 {                            
     send_coute=sendto(s, add, 34, 0, (struct sockaddr*)&servaddr, sizeof(servaddr) );
     if(send_coute==34)
   OSTimeDly(40);
  else
   send_coute=sendto(s, add1, 9, 0, (struct sockaddr*)&servaddr, sizeof(servaddr) );
  OSTimeDly(40);
  couter_byte--;
 }
  
    }   
}
回复

使用道具 举报

  • TA的每日心情
    开心
    2021-10-29 12:12
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2007-9-10 13:24:24 | 显示全部楼层

    RE:高手帮看看SmartARM2300开发板附带程序一处问题

    期待高手解答!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2007-9-11 08:41:08 | 显示全部楼层

    RE:高手帮看看SmartARM2300开发板附带程序一处问题

    修改TaskD的任务堆栈后就可以了!原来TaskD的堆栈大小定义为400,改为500就可以,以为找到原因是堆栈不足;奇怪的是改为100也可以,但是改为450却不行。因为对系统运行机制了解不够透彻,所以原因尚不清楚,大家一起来找bug啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2007-9-14 23:51:48 | 显示全部楼层

    RE:高手帮看看SmartARM2300开发板附带程序一处问题

    但是改为450却不行,这可真是奇了怪了。不过楼主的钻研精神值得鼓励啊
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-26 11:16 , Processed in 0.153648 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.