- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是tm4c1294+lwip1.4.1+FreeRTOS。
当 netconn_alloc()
被调用用于套接字通信
时,它会分配一个未使用的信号量。信号量的个数定义为SYS_SEM_MAX,所以不能超过SYS_SEM_MAX
。然而,由于信号量被连续分配,它达到 SYS_SEM_MAX
并停止工作,因为我猜 sys_sem_free()
没有正确释放它
这是在 sys_arch.c 中实现的创建信号量的函数
err_t
sys_sem_new(sys_sem_t *sem, u8_t count)
{
void *temp;
u32_t i;
/* Find a semaphore that is not in use. */
for(i = 0; i < SYS_SEM_MAX; i++) {
if(sems[i].queue == 0) {
break;
}
}
if(i == SYS_SEM_MAX) {
#if SYS_STATS
STATS_INC(sys.sem.err);
#endif /* SYS_STATS */
return ERR_MEM;
}
/* Create a single-entry queue to act as a semaphore. */
#if RTOS_FREERTOS
sem->queue = xQueueCreate(1, sizeof(void *));
if(sem->queue == NULL) {
#endif /* RTOS_FREERTOS */
#if SYS_STATS
STATS_INC(sys.sem.err);
#endif /* SYS_STATS */
return ERR_MEM;
}
/* Acquired the semaphore if necessary. */
if(count == 0) {
temp = 0;
xQueueSend(sem->queue, &temp, 0);
}
/* Update the semaphore statistics. */
#if SYS_STATS
STATS_INC(sys.sem.used);
#if LWIP_STATS
if(lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) {
lwip_stats.sys.sem.max = lwip_stats.sys.sem.used;
}
#endif
#endif /* SYS_STATS */
/* Save the queue handle. */
sems[i].queue = sem->queue;
/* Return this semaphore. */
return (ERR_OK);
}
这是在 sys_arch.c 中实现的另一个释放信号量的函数
void
sys_sem_free(sys_sem_t *sem)
{
/* Delete Sem , By Jin */
vQueueDelete(sem->queue);
/* Clear the queue handle. */
sem->queue = 0;
/* Update the semaphore statistics. */
#if SYS_STATS
STATS_DEC(sys.sem.used);
#endif /* SYS_STATS */
}
每当调用 netconn_free()
时,sys_sem_free()
都会释放信号量,但不会释放 sem[] 数组中分配的信号量
.
我添加了有人建议的 vQueueDelete(sem->queue);
,但还是一样。
不仅函数创建/释放 semaphore
而且处理 mbox
的函数与上面的函数相同,因此处理 mbox
的函数可能是错误的好吧。
已经有人向TI反馈了这个问题,但是好像还没有解决问题。
因此,我可能需要在 sys_arch.c
中实现我自己的处理 semaphore/mbox
的函数,但目前我没有任何线索。
谁能给我点意见?还是什么?
谢谢,进
最佳答案
/doc 中的 sys_arch.txt 文件有些帮助。显然,查看该文档以及 lwip 1.3.2 曾经做过的事情,看起来 ports/tiva-tm4c129/sys_arch.c 不正确且不完整。
sys_sem_free() 确实应该像您发现的那样执行 vQueueDelete()。它应该不做“sem->queue = 0”。如果您查看 src/api/api_msg.c 中的 netconn_free(),您可以看到它调用 sys_sem_free(),然后调用 sys_sem_set_invalid()。队列句柄将在第二个函数中需要,不应在第一个函数中被破坏。
sys_sem_set_invalid() 应该扫描 sems[] 数组,如果它找到与 sem-> 队列的匹配项,它应该将 sems[] 中的副本清零。完成后,它应该将 sem->queue 设置为 0。
我认为这与 Dunkel 的 sys_arch.txt 文档中的内容最匹配,并修复了我系统上的资源泄漏。
我同意邮箱的形状相同。 Fwiw,我继续以与刚才为 sems 描述的相似的方式修改了它们。
顺便说一句,我使用的 lwip 文件来自 TivaWare_C_Series 2.1.0.12573 third_party 文件夹。
关于c - 无法分配信号量/netconn Tiva C TM4C1294,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28637558/
我有一个 TIVA tm4c123G 我一直在尝试使用 I2C 协议(protocol)在它和我的 ADXL345 传感器之间建立通信,我成功地从加速度计写入和读取设备地址的读数以及我刚刚写入的寄存器
我正在尝试使用 TM4c123 构建一个简单的逻辑分析仪,但任何时候当我使用函数 ROM_.... 时,它似乎都是一个错误(隐式函数 ROM_..)有人知道为什么吗? 例如: ROM_FPUEnabl
我正在进行一个新的嵌入式系统项目,该项目分析输入频率并获取频率系数,并根据此信息生成一些信息。 我将使用 Tiva C TM4C 微 Controller ,并且我进行了大量搜索以查找任何兼容的 C
我正在尝试使用相同的序列器测量一些 ADC channel 。我以 Texas Tiva's ARM Cortex-M4 Workshop 的第 5 章为基础.因此,我的(中断的)原始代码运行良好:
我使用的是tm4c1294+lwip1.4.1+FreeRTOS。 当 netconn_alloc() 被调用用于套接字通信 时,它会分配一个未使用的信号量。信号量的个数定义为SYS_SEM_MAX,
我有一个 tiva c 微 Controller tm4c123gxl我已经尝试使用 I2C 一段时间了板上的模块带有数字加速度计但没有结果,我一直在尝试设置MDR注册一个要发送的特定值,但它保持为
在 Tiva(德州仪器 Cortex M4F ARM)TM4C129XNCZAD 上,我遇到了 I2C 接口(interface)问题。我通过端口 K 在 I2C 模块 4 上启用了主设备,通过端口
我正在尝试通过 I2C 总线将我的 Launchpad 设备连接到 Pololu MinIMU9v2 9DoF 传感器。我在 Linux 环境中工作,使用 arm-none-eabi-gcc 进行编译
在 Tiva (Texas Instruments Cortex M4F ARM) TM4C129XNCZAD 上,我遇到了 I2C 接口(interface)的另一个问题。我通过端口 K 在 I2C
我试图让 PF0 和 PF4 LED 在按下开关时闪烁。但它根本不打开任何 LED。 有人告诉我需要使用两个端口,我不明白为什么,因为这可以只用一个端口来完成 - 在本例中为端口 D - 但有人建议我
我目前正在上在线类(class) UT.6.02x 嵌入式系统 - 塑造世界,该类(class)使用 Tiva C TM4C123GXL LaunchPad。我也在看《The Definitive G
我使用 Tiva C 系列 TM4C123GH6PM 和 Code Composer Studio 从另一个相同类型的微 Controller 获取数据。好吧,我得到的数据以字节为单位。项目的目标是组
在研究有关 Stellaris/Tiva USB 库的 TI 文档时,我找不到该库是否可用于 DMA 传输。特别是,批量传输设备似乎不提供 DMA 的配置选项。 (整个手册只提到了 DMA for H
我目前正在尝试将我的 Tiva C 系列与 Sparkfun 分线板、IMU 数字组合板 - 6 自由度 ITG3200/ADXL345 连接,但我在使用 I2C 接口(interface)时遇到了问
该程序应该检测哪个开关打开,然后将交通灯更改为红色、黄色或绿色。我陷入困境,我不知道我的初始化是否适合端口 A 和端口 E。我们只想更改 DEN 和 DIR。当我在调试中运行它时,什么也没有发生。应该
我想使用 CMake 构建过程在 C++ 中对我的 Tiva C 系列 LaunchPad 板进行编程。我下载了一个简单的示例来闪烁我使用 make 构建的 RGB LED,我希望能够使用 cmake
我正在尝试从 Getting Started with the Tiva 运行实验 3 练习(第 71 页)。我将 Tiva C 系列 TM4C123GH6PM 与 Code Composer Stu
我正在使用 Makefile 在 Linux 中编译应用程序。我的编译器来自 Imperas (ovp world)。编译应用程序后,我得到一个 *.elf 文件,我想使用 TI 的软件 Unifla
我是一名优秀的程序员,十分优秀!