于我们进行WEB开发时,往往会赶上socket连接受服务器出现无法响应的题目,归根结底就是是网络通讯问题,或者端口未开的问题,下面总结了瞬间摸来因的方

花了3只夜晚,把这个节看罢,受益匪浅。

1 看与服务器的接连:ping ip地址

  1. 最为有效的当是跟中断相关的缪,优先排查中断优先级设置。
  2. 库房溢出检查,可能为此到,一般先拿库房设置的够用深,只要没有溢起便是好事,溢起了,掌握了栈溢出钩子函数排错很有益。
  3. printf()系的题材应有尽可能不见面面世,毕竟如果用打印调试信息的景下才祭,而且嵌入式系统一般还是因此串口重定向的。
    讲真,嵌入式中printf()当真挺烦的,严重影响属性,我的开支案例被窥见,串口打印会潜移默化板子的
    power save性能,这是实测及之。

统计 1

此章节事关新手最经常遇的3栽问题:

2 看和服务器连接的端口:netstat -nao | findstr 端口|进程ID

  1. 不当的间歇优先级设置
  2. 栈溢出
  3. 莫得当的采用printf()

统计 2

使用configASSERT()能显著地加强生产效率,它亦可捕获、识别多种类型的一无是处。强烈建议在出要调试中开启宏configASSERT()

关押下面的图,监听668端口,此时并不曾客户端连接到她,所以还处在监听状态,PID可以以任务管理器中找到,或者采取tasklist
| findstr “5936” 找到呼应的进程

暂停优先级

注意:这是世界级需要技术支持的题材,在大部的移植版本被经过定义configASSERT()哪怕能就捕获这个似是而非。

只要FreeRTOS移植版本支持中断嵌套,并且中断服务程序使用了FreeRTOS
API,那么得管暂停优先级设置也configMAX_SYSCALL_INTERRUPT_PRIORITY要么低一些。没有如此设置将会晤促成临界区失效,反过来就见面促成间歇性的缪。

当FreeRTOS运行在以下处理器上急需特别注意:

  • 暂停优先级以或者的高优先级,这就算是ARM Cortex
    处理器上之图景,还有有外的。在这些计算机上,调用FreeRTOS API
    的刹车的预先级无克留未初始化。
  • 预先级数值越强意味着逻辑上先行级更低,这恐怕与直觉相反,因此恐怕造成混淆。同样这说不定在少数ARM
    Cortex处理器上,可能还闹任何的。
  • 譬如说,在有处理器上一个抛锚的先行级也5,正在运转,但是能够给一个事先级为4之中断打断。因此,如果configMAX_SYSCALL_INTERRUPT_PRIORITY设置为5,那么其它其它的以FreeRTOS
    API的暂停的先期级必须安装也5还又胜似。在这种情况下先级为5或6底是可行之,但是优先级吧3的间歇是行不通的。
  • 不同的仓库实现巴中断优先级用不同的措施指定。此外尤其是本着ARM
    Cortex处理器相关的仓库,它们的间歇优先级以写入硬件寄存器之前是通过各移的。某些库或者自己开展动操作,然而其他的库期待中断优先级以污染为库函数之前曾经拓展了动操作。
  • 无异于架构上的异的兑现,实现之是搁浅优先级的于特位不同。例如同样的Cortex-M拍卖器某一个厂商可能实现了3只先行级比特位,但是其他一个厂商实现了4个优先级比特位。
  • 概念一个搁浅优先级的比较特位被分成两独片,一部分概念抢占的级别,另外的可比特位定义子优先级。确保有的比特位都是指定抢占的优先级,而子优先级无利用。

以一些移植版本中configMAX_SYSCALL_INTERRUPT_PRIORITY来一个号configMAX_API_CALL_INTERRUPT_PRIORITY

统计 3

栈溢出

栈溢出是亚单经常寻求技术支持的题材。FreeRTOS提供了几独特色来帮捕获和调节以及栈相关的问题。

下面这图中说明,有一个客户端和它们进行了连年,客户端的长距离端口是3049,进程的PID是8004

API函数uxTaskGetStackHighWaterMark()

每个任务还当护团结的堆栈,栈的总大小在创造任务的下即便指定了。函数uxTaskGetStackHighWaterMark()就用来查询分配受此任务之栈接近栈溢出的程度。返回值称为栈的高水位线

UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );

职责使用栈的小,随着任务之周转和刹车的拍卖时而长时而减少。uxTaskGetStackHighWaterMark()返从任务开始运行以来剩余可用之栈空间的极度小价。它回到的是栈未使用的上空占据尽充分价值的比值。高水位越接近于0,那么这个职责的仓库就越快要溢起。

统计 4

运作时栈检查

FreeRTOS提供了零星种植在运行时检查栈的建制。都是出于文件FreeRTOSConfig.h中的configCHECK_FOR_STACK_OVERFLOW来当编译时开展控制的。两栽方法还见面多上下文切换的工夫。

栈溢出钩子函数(又叫做栈溢出回调函数)是一个由于基本检查至栈溢出时调用的函数。要采用栈溢出钩子函数要满足以下原则:

  1. 在文件FreeRTOSConfig.h中把configCHECK_FOR_STACK_OVERFLOW设置为1或者2
  2. 实现以下钩子函数,使用了平等的函数名字跟原型:

    void vApplicationStackOverflowHook( TaskHandle_t pxTask, signed char pcTaskName);

栈溢出钩子函数会叫捕获和调剂栈错误越来越的简,但是有栈溢出荒谬时是尚未办法恢复的。此函数把生栈溢出之天职之句柄和名字传递进入。

栈溢出钩子函数会在一个停顿的上下文中开展调用。

少数微控制器在检测及一个不当的内存访问时会产生一个谬误非常,这个错误非常的触发会使得本根本不怕从未有过机会调用栈溢出钩子函数。

通过下面的觊觎可以视8004此客户端是IISExpress这个服务

运转时栈检查–方法1

当进行如下设置是碰头择方式1.

#define configCHECK_FOR_STACK_OVERFLOW 1

每当一个任务为切换出时其的整的推行上下文都见面为保留及它和谐的栈中。很有或马上就是是仓使用率高达极致老价值的时光。当使用方法1凡,当任务的上下文被保留之后基本回去检查栈指针是否在栈可用空间内。如果发现栈指针已经超越了可用的范围那么就是见面调用栈溢出钩子函数。

道1执行进度快,但是在起前后文切换时有或会见擦了栈溢出。

统计 5

运行时栈检查–方法2

开展如下设置后才见面选方式2.

#define configCHECK_FOR_STACK_OVERFLOW 2

除此之外艺术1中的一言一行,方法2尚会见履行外的自我批评。

创建任务时其的栈会被一个就解的样本填充。任务2检查库空间的最终20只字节,验证这个既了解的样书是否就于盖。如果当时20个字节的价和预期值未雷同那么就会调用栈溢出钩子函数。

术2勿设方法1赶快,当时相对来讲要尽早,毕竟只是是测试20个字节。很有或方法2会捕获到具备的栈溢出,但是发生或(几乎未容许)某些栈溢出要脱了。

3 可以拘留一个指定进程ID对应之应用程序tasklist | findstr 进行ID

不恰当地使用printf()sprintf()

非恰当地只用printf()凡一样栽普遍的错误源,并且没有发觉及这种不当,通常以开发者会追加又多之printf()来帮助调试,结果就是是加深了问题。

广大陆续编译器厂商会提供平等种植适合当小型嵌入式系统面临运用的printf()的兑现。即便以这种情形下,printf()的落实可能连无是线程安全之,几乎可一定不抱在刹车服务程序中使用,并且在输出为重定向到哪里,会占据相当长之等同段落实施时间。。

假若小型嵌入式系统的printf()的实现非可用,并且以了通用的printf()的贯彻,那么即使得特别注意了:

  • 但增加了一个针对性printf()或者sprintf()的调用就见面猛烈的增加使用执行文书的体积;
  • 倘利用了heap_3外的囤积空间方案,printf()sprintf()调用了malloc(),这个是无济于事的。
  • printf()sprintf()或者会见申请一个几倍增于普通状态的栈空间。

统计 6

Printf-stdarg.c

洋洋之FreeRTOS示例工程了动用了一个printf-stdarg.c的公文,它提供了一个极小的、栈使用率挺高效的能代表标准库函数版本的sprintf()心想事成。在大多数气象下,使得任务每次调用sprintf()或者相关的函数却分配还少之栈空间。

printf-stdarg.c提供了同样栽机制将printf()输出重定向,一个字节一个字节的出口,虽然缓慢,但是却大地减少了栈空间的挤占。

注意:并无是有着的FreeRTOS下充斥副本中文件printf-stdarg.c都落实了snprintf()函数统计。没有兑现snprintf()的副本直接忽略缓冲区大小参数,它们是直接照射到sprintf()函数。

printf-stdarg.c凡是开源的,但是是第三方有的,因此她的授权和FreeRTOS是分离的。它的授权条款在文书之首部。

4 可以经过telnet命令连接远程服务器的某部端口 telnet 远程IP
端口(IP和端口之间时有发生个空格)

别的大规模错误

统计 7

症状:添加一个简短任务交例程中也促成了例程挂掉

缔造任务急需打堆积如山中分红内存。许多示范工程的栈空间仅仅能容纳例程任务,因此当创造了例程任务后,没有足够的积空间留给其他更多之任务,队列,事件组,信号量。

空任务,又可能是FreeRTOS的看护进程,在调用vTaskStartScheduler()常是全自动创建的。只有当堆空间不足以创建这些任务时vTaskStartScheduler()才见面回。在调用vTaskStartScheduler()从此以后上加一个for(;;);会晤吃这个问题再度易于排错。

设惦记补偿加更多的天职,要么扩大堆空间,要么减少已存在的事例任务。

5  对点名端口的装有连接进行统计 netstat -na | find /C  ”6379″
,这样将具备包括6379底连日都进行分组统计,其中,  /C
就展示包含字符串的行数,/I是忽视大小写。

症状:中断中采用API导致应用挂掉

在暂停服务程序中并非采取API,除非API名字是为FromISR()终极。特别地,在刹车中永不创建一个临界区,除非动用中断安全的大幅度。

于支撑中断嵌套的FreeRTOS移植版本被,如果中断优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY不畏甭以其间使用
API 函数。

统计 8

症状:有时应用程序在暂停服务函数中挂掉

首先要检查中断是否生了栈溢出。有的移植版本被特检查职责的栈溢出,并没有检查中断是否栈溢出。

停顿的定义和下办法随着移植版本及编译器的差而各异。因此,其次要反省语法,宏定义,调用规则以刹车服务程序中的使用是否以及移植文档中之完全一致,是否和例程中的完全一致。

假设采用运行于数值越低的优先级表示逻辑上越强之预先级的电脑上,那么用确保分配给中断的先级要考虑到这种情景,因为她看起是负直觉的。

如利用运行于把暂停优先级默认设置为极端充分可能的预级的处理器上,需要保证每个中断的优先级没有留为默认值。

方这些命令进行平时咱们开展网络开支,web开发必备的艺,希望各位读者给重视!

症状:调度器尝试启动第一只任务时挂掉

保证设置了FreeRTOS的间歇句柄。参考FreeRTOS移植文档,还有示例程序。

一点处理器必须以调度器启动前处于特权模式。最简单易行的实现方式是在C语言main()前面的起步代码中尽管管电脑内置特权模式。

症状: 中断被大地禁止了,又或者临界区并未对地嵌套

如当调度器启动之前就调用了FreeRTOS
API函数那么中断就见面为故意地取缔,直到第一单任务启动之后才会再次使能。这样做是为保障系统非挂掉,原因在初始化过程中暂停尝试调用FreeRTOS
API函数,然而调度器还不曾启动,它或许处于一个无一样的状态。

除开调用taskENTER_CRITICAL()taskEXIT_CRITICAL()函数之外不要用其他其他的法门来更改微处理器的中止而能位和先行级标志。这有限单宏会统计中断嵌套深度确保当刹车嵌套深度为0时戛然而止而如果能。需要知悉某些库函数可能以其间使能同禁中断。

症状:远在调度器启动之前用就是挂掉了

出或产生上下文切换的刹车是明令禁止以调度器启动前便开履行的。同样的平整适用于尝试发送或收受FreeRTOS对象(例如队列和信号量)的另中断服务程序。上下文切换必须于调度器启动后才能够发生。

重重API函数必须在调度器启动之后才能够调用。最好是以调用vTaskStartScheduler()后用API的运用范围于创造诸如任务,队列和信号量上,而不是应用这些目标。

症状: 在调度器挂于时又或者是临界区之中调用API函数会促成应用程序挂掉

调用函数vTaskSuspendAll()会晤挂于调度器,调用函数xTaskResumeAll()会面过来调度器。

调用函数taskENTER_CRITICAL()见面进入临界区,调用函数taskEXIT_CRITICAL()会见离临界区。

以调度器挂于时要临界区内永远不要调用API函数。

声明

欢迎转载,请注明出处和作者,同时保留声明。
作者:LinTeX9527
出处:http://www.cnblogs.com/LinTeX9527/p/8031565.html
本博客的章要随便异常说明,均为原创,转载请注明出处。如未经作者同意要保留这个段子声明,且在篇章页面明显位置给出原文连接,否则保留追究法律责任的权利。