当前位置: 首页 > article >正文

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

背景

接之前 blog
36、【OS】【Nuttx】OSTest分析(2):环境变量测试
37、【OS】【Nuttx】OSTest分析(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】【Nuttx】OSTest分析(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.kler.cn/a/537736.html

相关文章:

  • 详细教程 | 如何使用DolphinScheduler调度Flink实时任务
  • 【电商系统架构的深度剖析与技术选型】
  • 设计模式.
  • 如何使用el-table的多选框
  • C++ 课程学习笔记:从对象生命周期看资源管理之道
  • DeepSeek-V3 与 DeepSeek R1 对比分析:技术与应用的全面解析
  • 云计算能加速产品的上市时间吗?
  • Python中3个与众不同的运算符 :=海象 ->箭头 //地板除法运算符
  • 力扣LeetCode: 63 不同路径Ⅱ
  • AtCoder Beginner Contest 392(A-G)题解
  • 用AVFrame + AVPacket 完成accede编码和直接用ffmpeg命令行实现acc编码的对比
  • 肖特基二极管正向浪涌电流,如何左右电路命运?
  • 编程中的科学计数法
  • 使用C++实现多个经典算法
  • mysql8安装时提示-缺少Microsoft Visual C++ 2019 x64 redistributable
  • 【场景题】架构优化 - 解耦Redis缓存与业务逻辑
  • LLM:DeepSeek 系列(三)
  • 【代码随想录|子序列系列300,674,718】
  • Qwen2-VL:增强视觉语言模型对世界任意分辨率的感知能力
  • 如何使用DeepSeek
  • mybatis 是否支持延迟加载?延迟加载的原理是什么?
  • systemverilog的program和module的区别
  • ReentrantLock/内存溢出监控
  • 南京观海微电子----开关电源电路图
  • Java_方法引用
  • leetcode——杨辉三角(简单移动的解法)