wifi 调试记录

1. tcp 调试遇到问题:bind失败,Address already in use

kill -15 是比较温和的通知进程即将关闭,但是否关闭由进程自己来决定。因此当关闭某个进程之后可能要经过一段时间的等待才会关闭该进程。

kill -9 则是比较强硬的直接关闭某个进程,但是可能会出现资源或者数据未保存就直接关闭的情况。

后来我发现这个tcp 是线程启的,,,跟 kill 命令没啥区别。

最后发现是该线程在服务关闭时不会退出,因此补充上将其退出的逻辑即可。

2. strstr

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

strlen

C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。

3. 内存越界问题尤其要注意,比如函数要求传的是地址,那参数就应该是&类的一定保证地址,不然很可能编译没问题,但是会导致UI无显示,这种问题是非常难找的。

4. if 判断的时候尤其注意:判等为 == 两个等于号,如果不写两个等于号就变成赋值了!很影响进度。

5. 函数传参的时候也要注意,传地址确实可行,但你对地址操作,出了函数地址是不变的,因为地址也是十六进制的变量,相当于值的副本而已,所以可以通过指针修改地址指向的变量,但是直接修改地址是和值修改相同的性质。

6. 内存越界问题中,strcat 这个函数调用时第二个参数如果是双引号引起来的字符串如果用单引号扩起来,则会出现越界错误。

7. 写代码,一定不能着急,这线程退出,就因为写错了俩字母,我多debug了一小时!

8. goto 语句原来是不通过goto标志也可以执行啊,,,看来主要用途还是跳出循环 。

9.

线程属性 pthread_attr_t ,顾名思义,每个线程具有的一些属性,可用 pthread_attr_init 和 pthread_attr_destroy 进行对属性的初始化和去除属性设定,init 后该线程所带的所有属性即为系统默认的属性,destroy后则将属性设为无效的值,因此如果 destroy后再次调用 pthread_create 使用 attr 对象,则会报错 。以下是 pthread_attr_t 的结构体。

typedef struct {

       int   detachstate;   线程的分离状态  int    schedpolicy;  线程调度策略  struct  sched_param   schedparam;  线程的调度参数

       int   nheritsched;  线程的继承性   int    scope;    线程的作用域   size_t    guardsize;   线程栈末尾的警戒缓冲区大小

       int   stackaddr_set;   void*   stackaddr;   线程栈的位置   size_t    stacksize;    线程栈的大小

}pthread_attr_t ;

线程分离状态,默认值为非分离 joinable,该线程状态使得本线程即使结束后,只有在主线程调用 pthread_join()后才会回收资源,同时如果线程 A创建了线程 B,并调用了 pthread_join () ,则线程 A会处于阻塞状态直到线程 B结束 ; 而如果给分离状态置为 detach 即分离态,则该线程在运行完后系统就会自动回收线程资源 ;

线程的继承性,指该线程是否继承所创建线程的调度策略与调度参数,可选参数为 PTHREAD_INHERIT_SCHED 继承与 PTHREAD_EXPLICIT_SCHED 不继承 ,如果想设置继承性属性,则最好先设置调度策略与调度参数 ;

线程调度策略,指该线程被系统调用时的策略。策略分三种:1分时调度策略 SCHED_OTHER:非实时调度策略,优先级为 0,且无法设置优先级,根据 nice 值和 counter 来决定谁先运行以及占用 CPU的时间  ,2实时调度策略 SCHED_FIFO 、SCHED_RR :FIFO是先到先服务实时策略,一旦占用 CPU 将一直运行到程序结束或有其他优先级更高的线程抢占,而如果两线程优先级相同则根据线程所处的队列位置来决定;RR是时间片轮转实时策略,当进程所具有的时间片用完后就会重新分配时间片并将该线程置于就绪队列尾,这样就保证了具有相同优先级的线程的调度公平性 。

值得注意的是,当同时存在实时调度策略线程与分时调度策略线程的时候,实时策略具有比分时更高的优先级,并会抢占分时策略的资源;如果都是实时策略,则会根据设置的调度参数大小来决定谁先谁后,不过并不一定按照调度参数大小决定,有时也会出现执行一会儿比较小的参数的线程再执行大调度参数的线程的情况;

线程调度参数,该结构体的子成员控制着优先权值大小,该权值用于区分线程执行时的先后顺序 。

struct sched_param {

       intsched_priority ;

} ;

10. extern 的用法我之前一直用错了,如果不需要去外部寻找函数定义,那就别用 extern ,就在头文件里对函数进行声明就好了。0922还犯了一个错误,我在头文件里进行函数的定义与实现,应当是C文件里实现,头文件里声明。

好像不是这样啊,再确定一次extern的用法吧。

11. 神奇!strtok 返回第一个分割的字符后,继续获取后面的字符居然是通过 strtok ( NULL , ' , ' ) ; 这种调用来进行的。

posted @ 2022-09-15 17:33  飞鸟了了  阅读(61)  评论(0)    收藏  举报