38、【OS】【Nuttx】OSTest分析(3):参数传递

embedded/2025/2/9 11:10:27/

背景

接之前 blog
36、【OS】【NuttxOSTest分析(2):环境变量测试
37、【OS】【NuttxOSTest分析(2):任务创建
分析完环境变量测试,和任务创建的一些关键要素,OSTest 进入下一阶段,创建新任务继续测试
在这里插入图片描述
函数参数定义如下,由二维字符数组组成,其中最后一个数组成员固定为 NULL,表示参数结束,因为从 task_create 可见,没有传递参数个数 argc,需要依靠 NULL 来判断成员结束(约定俗称的设计,其实直接多加一个参数 argc 来传递参数个数也不是不行)

在这里插入图片描述
可以看见不管是 main,还是 user_main,入参其实都有 argc
在这里插入图片描述

参数校验测试

user_main 进来后第一个测试项即下面的参数传递校验,看经过了 OS 调度后,传入的参数个数和参数本身是否一致。采用了断言 ASSERT 进行判断,如果参数个数和参数成员不正确,就不让往下进行了,会直接退出 user_main
在这里插入图片描述

参数传递

参数传递的大致分为两个流程:

  • 参数入栈:新建任务,传入参数,存入栈中
    在这里插入图片描述
  • 参数出栈:调度时机到,从栈中取出参数,传递给 user_main
    在这里插入图片描述

参数入栈

task_create 到 nxthread_create 这条链路,之前 blog 37、【OS】【NuttxOSTest分析(2):任务创建 已经分析过,这里主要来看下 nxtask_setup_stackargs 的过程,nxtask_setup_stackargs 定义如下,主要功能:从栈上分配空间,并将参数 argv 复制到栈上
在这里插入图片描述
栈上存储的参数格式如下,前面 N + 2 个内存空间(char*)用来存放对应字符数组的指针,其中 + 2 是因为第一个元素要放 task_name,最后一个元素要放 NULL,然后后面的内存空间元素放置具体的内容:
在这里插入图片描述
具体实现如下,先从栈上取出一个二维指针
在这里插入图片描述
str 负责具体内容,偏移到 N + 2 个内存空间(char*)之后,第一个元素指向 str,向 str 复制 task_name,后面复制 argv 的方式一样,这里不再分析
在这里插入图片描述

参数出栈

来看下 nxsched_get_stackargs 的实现,注释上说,args 参数紧跟着 TLS(thread local storage)数据,TLS 数据在之前的 blog 22、【OS】【Nuttx】最小系统初始化分析(1):任务创建 已经分析
在这里插入图片描述
故分配完参数后的栈上数据结构大致是这样的
在这里插入图片描述
这点从 nxtask_setup_stackargs 的实现中也能看出来,在 tls_init_info 初始化 TLS 数据时,首次使用了 up_stack_frame 分配了栈上空间,然后紧接着 nxtask_setup_stackargs 再次使用 up_stack_frame 分配了栈上空间
在这里插入图片描述
至此,参数传递分析完毕


http://www.ppmy.cn/embedded/160793.html

相关文章

【数据结构】(7) 栈和队列

一、栈 Stack 1、什么是栈 栈是一种特殊的线性表,它只能在固定的一端(栈顶)进行出栈、压栈操作,具有后进先出的特点。 2、栈概念的例题 答案为 C,以C为例进行讲解: 第一个出栈的是3,那么 1、…

python实现物体轮廓提取及标注【含源码方案及演示】

python实现物体轮廓提取及标注 效果源码方法 效果 源码 图中的实现源码放在了这里,下载后可直接运行:https://download.csdn.net/download/qq_43474959/90355704 资源内附带示例图和调好的代码,下载后可以直接进行运行调试 方法 本方法使用…

python Excel 表读取合并单元格以及清除空格符

读取合并单元格并保留合并信息 读取合并单元格并保留合并信息清除各单元格的空格和换行符,并去除列名中的空格和换行符 读取合并单元格并保留合并信息 当我们只是使用 pandas 的 read_excel 方法读取 Excel 文件时,我们可能会遇到一个很棘手的问题&…

java-list源码分析

List底层: List 是 Java 中的一个接口,具体的底层实现取决于它的实现类。最常见的 List 实现类是 ArrayList 和 LinkedList,它们的底层原理完全不同。下面我们分别分析这两种实现类的底层原理。 ArryList原理: ArrayList 是基于…

基于DeepSeek的具身智能高校实训解决方案——从DeepSeek+机器人到通用具身智能

一、 行业背景 具身智能作为人工智能领域的新兴方向,为机器人与环境交互赋予了全新的内涵和能力,它不再局限于传统的编程式指令执行,而是朝着像人类一样理解和适应环境的方向发展。 在具身智能的发展历程中,DeepSeek的出现成为了…

Java版本与JDK版本

两者关联 Java版本指的Java语言和平台的版本,例如Java8、Java11、Java17等,每个版本会引入新特性、改进和修复。 JDK(Java Development Kit)版本则是开发工具包,包含编译器、调试器等工具,通常与Java版本对应,例如JDK…

树和二叉树_7

树和二叉树_7 一、leetcode-102二、题解1.引库2.代码 一、leetcode-102 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 样例输入:root [3,9,20,null,nu…

原子核链式反应与曼哈顿计划

原子核链式反应是一种涉及原子核裂变的特殊链式反应,具有自我持续性和指数级增长的特性。 1. 什么是原子核链式反应? 原子核链式反应是指,当一个原子核(比如铀-235或钚-239)被中子撞击时,发生核裂变&#…