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

相关文章

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.