LWIP2.1.3+UCOSIII3.08的系统接口arch.c修改

2024-04-14 17:52

本文主要是介绍LWIP2.1.3+UCOSIII3.08的系统接口arch.c修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自己的笔记不保证正确

err_t
sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg)
{BaseType_t ret;BaseType_t xHigherPriorityTaskWoken = pdFALSE;LWIP_ASSERT("mbox != NULL", mbox != NULL);
//  LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL);ret = xQueueSendToBackFromISR(mbox->mbx, &msg, &xHigherPriorityTaskWoken);if (ret == pdTRUE) {if (xHigherPriorityTaskWoken == pdTRUE) {return ERR_NEED_SCHED;}return ERR_OK;} else {LWIP_ASSERT("mbox trypost failed", ret == errQUEUE_FULL);
//    SYS_STATS_INC(mbox.err);return ERR_MEM;}
}freeRTOS移植LWIP的这个函数的讲解

这段代码是FreeRTOS移植LWIP网络协议栈时使用的函数,用于在中断服务程序中向消息邮箱(mbox)发送消息。函数的返回类型是err_t,表示错误码。

函数的实现逻辑如下:

  1. 首先,通过断言(LWIP_ASSERT)确保传入的消息邮箱(mbox)不为空。
  2. 调用xQueueSendToBackFromISR函数将消息发送到消息邮箱中,并将返回值赋给ret变量。同时,还会更新一个标志位xHigherPriorityTaskWoken,用于指示是否有更高优先级的任务需要立即唤醒。
  3. 如果发送成功(ret == pdTRUE),则判断是否有更高优先级的任务需要唤醒。如果需要唤醒,则返回ERR_NEED_SCHED错误码;否则,返回ERR_OK表示发送成功。
  4. 如果发送失败(ret != pdTRUE),则通过断言(LWIP_ASSERT)确保发送失败的原因是消息邮箱已满(ret == errQUEUE_FULL)。然后返回ERR_MEM错误码,表示内存不足。

 

 

void sys_mutex_lock(sys_mutex_t *mutex)
{BaseType_t ret;LWIP_ASSERT("mutex != NULL", mutex != NULL);LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL);ret = xSemaphoreTakeRecursive(mutex->mut, portMAX_DELAY);LWIP_ASSERT("failed to take the mutex", ret == pdTRUE);
}freeRTOS移植LWIP的这个函数的讲解

这是一个用于在FreeRTOS中移植LWIP的函数,它用于获取一个互斥锁(mutex)。下面是对该函数的详细讲解:

  1. 首先,函数接受一个指向sys_mutex_t类型的指针作为参数,该类型是LWIP中定义的互斥锁结构体。

  2. 接下来,使用LWIP_ASSERT宏来进行断言检查,确保传入的mutex指针和mutex->mut指针都不为空。如果断言失败,将会触发断言错误。

  3. 然后,调用xSemaphoreTakeRecursive函数来获取互斥锁。xSemaphoreTakeRecursive函数是FreeRTOS中用于获取递归互斥锁的函数。它的第一个参数是要获取的互斥锁对象,第二个参数是等待时间,这里使用了portMAX_DELAY表示无限等待。

  4. 最后,使用LWIP_ASSERT宏再次进行断言检查,确保成功获取了互斥锁。如果断言失败,将会触发断言错误。

总结一下,该函数的作用是在FreeRTOS中获取一个互斥锁,并通过断言检查确保操作的正确性。

void sys_mutex_unlock(sys_mutex_t *mutex)
{BaseType_t ret;LWIP_ASSERT("mutex != NULL", mutex != NULL);LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL);ret = xSemaphoreGiveRecursive(mutex->mut);LWIP_ASSERT("failed to give the mutex", ret == pdTRUE);
}freeRTOS移植LWIP的这个函数的讲解

这是一个用于在FreeRTOS中移植LWIP的函数,它的作用是释放一个互斥锁(mutex)。下面是对该函数的详细讲解:

  1. 首先,函数接受一个指向sys_mutex_t类型的指针作为参数,该类型是LWIP中定义的互斥锁结构体。

  2. 在函数内部,使用LWIP_ASSERT宏来进行断言检查,确保传入的参数不为空。如果参数为空,则会触发断言错误。

  3. 接下来,通过xSemaphoreGiveRecursive函数来释放互斥锁。xSemaphoreGiveRecursive函数是FreeRTOS提供的函数,用于递归地释放一个二值信号量(互斥锁)。

  4. 在释放互斥锁之后,再次使用LWIP_ASSERT宏来检查是否成功释放了互斥锁。如果释放失败,则会触发断言错误。

总结一下,该函数的主要作用是释放一个互斥锁,确保在使用完互斥锁后能够正确地释放资源。

xSemaphoreGiveRecursive(mutex->mut);请用UCOSIII替换

替换为OSSemPost(&mutex);

void
sys_mutex_free(sys_mutex_t *mutex)
{LWIP_ASSERT("mutex != NULL", mutex != NULL);LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL);SYS_STATS_DEC(mutex.used);vSemaphoreDelete(mutex->mut);mutex->mut = NULL;
}freeRTOS移植LWIP的这个函数的讲解

这段代码是FreeRTOS移植LWIP时使用的函数,用于释放互斥锁(mutex)。下面是对代码的解释:

  1. 首先,通过断言(LWIP_ASSERT)来确保传入的互斥锁指针(mutex)和互斥锁对象(mutex->mut)不为空。断言是一种在程序中检查条件是否满足的方法,如果条件不满足,会触发断言失败并输出错误信息。

  2. 接下来,通过SYS_STATS_DEC宏来减少互斥锁的使用计数。SYS_STATS_DEC是一个用于统计的宏,用于减少指定统计项的计数。

  3. 然后,调用vSemaphoreDelete函数来删除互斥锁对象。vSemaphoreDelete是FreeRTOS提供的函数,用于删除一个二进制信号量(互斥锁)。这样可以释放互斥锁所占用的资源。

  4. 最后,将互斥锁对象指针(mutex->mut)设置为NULL,表示该互斥锁已被释放。

vSemaphoreDelete函数不需要等待直到没有任务申请。vSemaphoreDelete函数是FreeRTOS中用于删除一个二值信号量或计数信号量的函数。它会立即删除信号量,并释放相关的资源,而不会等待任务完成对信号量的申请。

这篇关于LWIP2.1.3+UCOSIII3.08的系统接口arch.c修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903614

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提