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 分配了栈上空间
在这里插入图片描述
至此,参数传递分析完毕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux常用命令——压缩和解压类

文章目录 gzip/gunzip 压缩zip/unzip 压缩tar 打包 gzip/gunzip 压缩 基本语法 gzip 文件(功能描述:压缩文件,只能将文件压缩为*.gz 文件) gunzip 文件.gz (功能描述:解压缩文件命令)经验技巧 …

Python多版本管理

关注后回复 python 获取相关资料 ubuntu18.04 # ubuntu18 默认版本 Python 2.7.17 apt install python python-dev python-pip# ubuntu18 默认版本 Python 3.6.9 apt install python3 python3-dev python3-pip# ubuntu18 使用 python3.8 apt install python3.8 python3.8-dev#…

五、OSG学习笔记-矩阵变换

一、矩阵变换的三种方式 二、 示例代码&#xff1a; #include<windows.h> #include<osg/Node> #include<osgViewer/Viewer> #include<osgViewer/ViewerEventHandlers> #include<osgDB/ReadFile> #include<osgGA/TrackballManipulator>// …

数据结构与算法-递归

单路递归 二分查找 /*** 主函数&#xff1a;执行二分查找。* * param a 要搜索的数组&#xff08;必须是已排序的&#xff09;* param target 目标值* return 返回目标值在数组中的索引&#xff1b;如果未找到&#xff0c;则返回 -1*/ public static int binarySearch(int[] …

使用python构建局域网HTTP服务进行文件共享

网上有很多参考&#xff0c;在此作为归纳和自己的笔记 首先确保python的目录在系统环境变量中&#xff0c;如果同时有python2.和python3.版本可以将python程序改名进行区分&#xff0c;譬如python2的解释器程序从python.exe改为python2.exe&#xff0c;python3改为python3c.ex…

深入理解小波变换:信号处理的强大工具

引言 在科学与工程领域&#xff0c;信号处理一直是关键环节&#xff0c;傅里叶变换与小波变换作为重要的分析工具&#xff0c;在其中发挥着重要作用。本文将深入探讨小波变换&#xff0c;阐述其原理、优势以及与傅里叶变换的对比&#xff0c;并通过具体案例展示其应用价值。 一…

洛谷P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值

虽然是简单题&#xff0c;就是log2的运用&#xff0c;然后对于同层的数据累加取最大值 #include<bits/stdc.h>using namespace std;const int N100010; int a[N];int main(){int n;cin>>n;int MAX-1;for( int i1;i<n;i){int j;cin>>j;// cout<<(in…

Java基础知识(七) -- 集合

1.概述 集合是 Java 中提供的一种容器&#xff0c;可以用来存储多个数据。集合主要分为两大系列&#xff1a;Collection和Map&#xff0c;Collection 表示一组对象&#xff0c;Map表示一组映射关系或键值对。集合和数组既然都是容器&#xff0c;它们有啥区别呢&#xff1f; 数…

C++Primer学习(2.1)

前言&#xff1a;与大多数编程语言一样&#xff0c;C的对象类型决定了能对该对象进行的操作&#xff0c;一条表达式是否合法依赖于其中参与运算的对象的类型。一些语言&#xff0c;如Smalltalk和Python 等&#xff0c;在程序运行时检查数据类型;与之相反&#xff0c;C是一种静态…

TensorFlow深度学习实战(7)——分类任务详解

TensorFlow深度学习实战&#xff08;7&#xff09;——分类任务详解 0. 前言1. 分类任务1.1 分类任务简介1.2 分类与回归的区别 2. 逻辑回归3. 使用 TensorFlow 实现逻辑回归小结系列链接 0. 前言 分类任务 (Classification Task) 是机器学习中的一种监督学习问题&#xff0c;…

国产编辑器EverEdit - 查找功能详解

1 查找功能详解 1.1 应用场景 查找关键词应该是整个文本编辑/阅读活动中&#xff0c;操作频度非常高的一项&#xff0c;用好查找功能&#xff0c;不仅可以可以搜索到关键字&#xff0c;还可以帮助用户高效完成一些特定操作。 1.2 基础功能 1.2.1 基础查找功能 选择主菜单查…

5分钟了解回归测试

1. 什么是回归测试&#xff08;Regression Testing&#xff09; 回归测试是一个系统的质量控制过程&#xff0c;用于验证最近对软件的更改或更新是否无意中引入了新错误或对以前的功能方面产生了负面影响&#xff08;比如你在家中安装了新的空调系统&#xff0c;发现虽然新的空…

【AI】卷积神经网络CNN

不定期更新&#xff0c;建议关注收藏点赞。 目录 零碎小组件经验总结早期的CNN 最重要的模型架构无非是cnn 或 transformer 零碎小组件 全连接神经网络 目前已经被替代。 每个神经元都有参与&#xff0c;但由于数据中的特征点变化大&#xff0c;全连接神经网络把所有数据特征都…

企业FTP替代升级,实现传输大文件提升100倍!

随着信息技术的飞速发展&#xff0c;网络安全环境也变得越来越复杂。在这种背景下&#xff0c;传统的FTP&#xff08;文件传输协议&#xff09;已经很难满足现代企业对文件传输的需求了。FTP虽然用起来简单&#xff0c;但它的局限性和安全漏洞让它在面对高效、安全的数据交换时…

LabVIEW铅酸蓄电池测试系统

本文介绍了基于LabVIEW的通用飞机铅酸蓄电池测试系统的设计与实现。系统通过模块化设计&#xff0c;利用多点传感器采集与高效的数据处理技术&#xff0c;显著提高了蓄电池测试的准确性和效率。 ​ 项目背景 随着通用航空的快速发展&#xff0c;对飞机铅酸蓄电池的测试需求也…

Lecture8 | LPV VXGI SSAO SSDO

Review: Lecture 7 | Lecture 8 LPV (Light Propagation Volumes) Light Propagation Volumes(LPV)-孤岛惊魂CryEngine引进的技术 LPV做GI快|好 大体步骤&#xff1a; Step1.Generation of Radiance Point Set Scene Representation 生成辐射点集的场景表示&#xff1a;辐射…

0012—数组

存取一组数据&#xff0c;使用数组。 数组是一组相同类型元素的集合。 要存储1-10的数字&#xff0c;怎么存储&#xff1f; C语言中给了数组的定义&#xff1a;一组相同类型元素的集合。 创建一个空间创建一组数&#xff1a; 一、数组的定义 int arr[10] {1,2,3,4,5,6,7,8,…

AI绘画社区:解锁艺术共创的无限可能(9/10)

AI 绘画&#xff1a;不只是技术&#xff0c;更是社交新潮流 在科技飞速发展的今天&#xff0c;AI 绘画早已不再仅仅是一项孤立的技术&#xff0c;它正以惊人的速度融入我们的社交生活&#xff0c;成为艺术爱好者们交流互动的全新方式&#xff0c;构建起一个充满活力与创意的社…

让office集成deepseek,支持office和WPS办公软件!(体验感受)

导读 AIGC:AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术&#xff0c;能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…

c++ template-3

第 7 章 按值传递还是按引用传递 从一开始&#xff0c;C就提供了按值传递&#xff08;call-by-value&#xff09;和按引用传递&#xff08;call-by-reference&#xff09;两种参数传递方式&#xff0c;但是具体该怎么选择&#xff0c;有时并不容易确定&#xff1a;通常对复杂类…