基础知识学习 -- qnx 系统

QNX是一个基于优先级抢占的系统。

这也导致其基本调度算法相对比较简单。因为不需要像别的通用操作系统考虑一些复杂的“公平性”,只需要保证“优先级最高的线程最优先得到 CPU”就可以了。

基本调度算法

调度算法,是基于优先级的。QNX的线程优先级,是一个0-255的数字,数字越大优先级越高。所以,优先级0是内核中的idle线程。同时,优先级64是一个分界岭。就是说,优先级1 – 63 是非特权优先级,一般用户都可以用,而64 – 255必须是有root权限的线程才以设。这个“优先级64”分界线,如果有必要,还可以通过启动Procnto时传 –P <priority> 来改变。

调度算法的对像是线程,而线程在QNX上,有大约20个状态。(参考 /usr/include/sys/states.h)在这许多状态中,跟调度有关的,其实只有 STATE_RUNNING和STATE_READY两个状态。STATE_RUNNING是线程当前正在使用CPU,而STATE_READY是等着被执行(被调度)的线程。其他状态的线程,处于某种“阻塞”状态中,调度算法不需要关注。

GVM: Guest Virtual Machine

QVM: hypervisor的一个process

PVM: Physical virtual machine

LA: Linux Android

LV: Linux Vehicle/Auto Grade Linux

VMM:Virtual machine manager

HAB:Hypervisor Abstract Communication driver

QTD

Secure Boot中最后一项是可选的完整性保护的文件系统,QTD便是其中一种。QTDQNX Trusted Disk),是QNX针对数据存储的安全机制,通过结合哈希树和PKI密钥签名,为二进制数据、关键系统配置等提供完整性和真实性保护。基于 Merkle ,如图2所示,在构建 QTD 映像时,元数据哈希树是从源文件系统映像的块一层一层构建的,直至RootHash

Image filesystem
每个QNX Neutrino系统映像都提供了一个简单的只读文件系统,该文件系统将一组文件内置于操作系统映像中。

由于这个映像可能同时包含可执行文件和数据文件,因此这个文件系统对于许多嵌入式系统来说就足够了。如果需要额外的文件系统,它们将作为模块放置在映像中,以便根据需要启动它们。

RAM “filesystem”
每个QNX Neutrino系统还提供了一个简单的基于ram的“文件系统”,允许将读写文件放在/dev/shmem下.(注意: /dev/shmem实际上不是一个文件系统。它是一个关于共享内存名称的窗口,这些名称碰巧具有一些文件系统式的特征)。这种RAM文件系统在小型嵌入式系统中最有用,在这些系统中,不需要重新引导进行持久存储,但是需要一个具有有限功能的小型、快速、临时存储文件系统。

文件系统是随procnto免费提供的,不需要任何设置。可以简单地在/dev/shmem下创建文件,并将它们增长到任意大小(取决于RAM资源)。尽管RAM文件系统本身不支持硬链接或软链接或目录,但可以通过使用process-manager链接创建到它的链接。例如,可以创建一个指向基于ram的/filedir目录的链接:

这告诉procnto创建一个到/dev/shmem的进程管理器链接,即“/filedir”。然后,应用程序可以打开/filedir下的文件,就好像它是一个普通的文件系统一样。为了最小化进程管理器中RAM文件系统代码的大小,这个文件系统特别不包含“大文件系统”特性,例如文件锁定和目录创建。

power-Safe (fs-qnx6.so) filesystem

The limits for Power-Safe filesystems (supported by fs-qnx6.so) include:

Physical disk sectors

32-bit (2 TB), using the devb API.

Logical filesystem block size

512, 1024, 2048, 4096, 8192, 16384, 32768, or 65536 bytes. This is set when you initially format the filesystem; the default block size is 4096 bytes.

Filename length

510 bytes (UTF-8). If the filename is less than 28 bytes long, it's stored in the directory entry; if it's longer, it's stored in an external file, and the directory entry points to the name.

Pathname length

PATH_MAX (1024) bytes, not including the mountpoint or the terminating NUL.

Maximum file size

The maximum file size depends on the block size but also the maximum filesystem size.

Although 64-bit addressing is used, the block pointers are always 32 bits. The inode for a file has 16 pointers at the root of the block lookup tree. So, with a 1 KB block size, you can fit 256 block pointers in a block and so, a file that's up to 16 × 256 × 1 KB (4 MB) requires one level of indirect pointers. If the file is bigger, you need two levels (i.e., 16 blocks of 256 pointers to blocks holding another 256 pointers to blocks), which gives a maximum file size of 1 GB. For three levels of indirect pointers, the maximum file size is 256 GB.

If the block size is 2 KB, then each block holds up to 512 pointers, and everything scales accordingly. However, for block sizes of 4 KB and higher, the maximum file size is limited by the maximum filesystem size. So the file size limits in the bottom four rows of the table shown just below match those in the corresponding rows of the table shown for the maximum filesystem size (see this other property's description further below):

Maximum number of files

The same as the maximum number of inodes minus two (one is reserved for "/", the other for "/.boot").

This number can be set by either mkqnx6fs (with the -i option), or mkqnx6fsimg (with the num_inodes attribute in the buildfile). Both utilities assign default values if the number isn't specified.

You can query this value at any time with df -g mountpoint, where the variable is set to the Power-Safe filesystem mountpoint. The chkqnx6fs -S option also shows this value.

https://www.qnx.com/developers/docs/7.0.0/index.html#com.qnx.doc.neutrino.user_guide/topic/limits_QNX6_limits.html

gpio in/gpio out/ interrupt采用dts的配置方法,配置参数解释如下:

对于linux-4.9:

gpios = <&r_pio PL 0x4 0x0 0x1 0x0 0x1>;

            |    |  |   |   |   |   `---输出电平,只有output才有效

            |    |  |   |   |   `-------驱动能力,值为0x0时采用默认值

            |    |  |   |   `-----------上下拉,值为0x1时采用默认值

            |    |  |   `---------------复用类型

            |    |  `-------------------当前bank中哪个引脚

            |    `-----------------------哪个bank

            `---------------------------指向哪个pio,属于cpus要用&r_pio

使用上述方式配置gpio时,需要驱动调用以下接口解析dts的配置参数:

int of_get_named_gpio_flags(struct device_node *np, const char *list_name, int index,

enum of_gpio_flags *flags)

拿到gpio的配置信息后(保存在flags参数中,见4.2.8.小节),在根据需要调用相应的标准接口实现自己的功能

对于linux-5.4:

gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>;

            |   |      |

            |   |      `-------------------gpio active时状态,如果需要上下拉,还可以或上

            GPIO_PULL_UP、GPIO_PULL_DOWN标志

            |   `-----------------------哪个bank

            `---------------------------指向哪个pio,属于cpus要用&r_pio

main函数的返回值

1.main函数的返回值是返回给调用它的父进程也就是执行它的可执行文件。比如shell调用,这个父进程调用子进程来执行一个任务,然后子进程执行完成后通过main函数的返回值返回给父进程一个答复,这个答复来表示子进程执行的结果是正确还是错误(0表示成功,负数表示失败)

(1)用shell脚本执行程序可以获取获取程序的返回值

创建shell脚本:vi return.sh

  qnx 和linux下测试都是 ok,

int main(int argc, char *argv[ ]) {

printf("---------------------- main 1\n");

oem_pm_pulse_register();

//while(1)

{

// pause();

}

printf("------------------ test qnx return ret 10 \n");

return 10;

}

apps/qnx_ap/vendor/test/oem_app_test/src$ vim main.c

test.sh

#!/bin/sh

./oem_app_test

echo $?

# chmod a+x test.sh

# ./test.sh

---------------------- main 1

oem_pm register failed: -1

------------------ test qnx return ret 10

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS调试快捷键

VS调试快捷键 4. VS调试快捷键4.1 环境准备4.2 调试快捷键调试最常使⽤的⼏个快捷键&#xff1a; 4. VS调试快捷键 那程序员怎么调试代码呢&#xff1f; 4.1 环境准备 首先是环境的准备&#xff0c;需要⼀个支持调试的开发环境&#xff0c;我们上课使用VS&#xff0c;应该把…

Magical Combat VFX

这个包包含30个可供游戏使用的VFX,有各种口味,为您的游戏增添趣味! 所有VFX都经过了很好的优化,可以在所有平台上使用。 这个包特别有一堆闪电魔法,有两种主要的变体,一种是深色的,另一种是浅色的。但它也提供了一系列其他视觉效果,如神圣咒语、音乐主题等等! 我们提供…

fetch,前端 面试题

Fetch Fetch API 是近年来被提及将要取代XHR的技术新标准&#xff0c;是一个 HTML5 的 API。 基于promise的设计&#xff0c;返回的是Promise对象 fetch()采用模块化设计&#xff0c;API 分散在多个对象上&#xff08;Response 对象、Request 对象、Headers 对象&#xff09;…

如何在webapp中于动发布一个应用

目录 第一步&#xff1a;在webapp文件夹内自定义文件夹第二步&#xff1a;生成一个文本&#xff0c;并把后缀改为 .html第三步&#xff1a;进入bin文件夹打开服务第四步&#xff1a;打开方式选择java第六步&#xff1a;输入你想输出的东西第七步&#xff1a;双击运行即可 第一步…

mybatis-plus笔记1

mybatis-plus笔记1 mybatis-plus快速入门基于Mapper接口的crud增强基于service的crud分页查询分页添加到自定义方法queryWrapper简单使用使用细节 updateWrapperlambdaWrapper mybatis-plus快速入门 pom.xml文件中导入相关依赖 application.yaml配置文件 MainApplication.java…

使用Java Runtime执行docker下的mysqldump

Runtime直接使用 docker exec mysql mysqldump -u%s -p%s cblog > %s&#xff08;%s是需要填充的数据&#xff09;&#xff0c;命令无法执行并且不会报错&#xff0c;需要使用字符串数组加入"sh", “-c”&#xff0c;具体代码示例&#xff1a; /*** MySQL数据备份…

KubeSphere 社区双周报|2024.02.29-03.14

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2024.02.29-03.14…

vue 记录一个echarts页面 单色环形饼图 多色环形饼图 柱状图加折线图 饼状图 双柱状图 雷达图 多色堆叠柱状图

“设备使用”模块没有做 因为项目不需要 仅自己记录使用 可供参考 那么上代码 <template><!--app-container--><div class"home-wrap"><div class"wrap" v-if"schoolId"><!--第一块--><div class"statis…

MongoDB从0到1:高效数据使用方法

MongoDB&#xff0c;作为一种流行的NoSQL数据库。从基础的文档存储到复杂的聚合查询&#xff0c;从索引优化到数据安全都有其独特之处。文末附MongoDB常用命令大全。 目录 1. 引言 MongoDB简介 MongoDB的优势和应用场景 2. 基础篇 安装和配置MongoDB MongoDB基本概念 使…

Win10 无法安装微软1月安全更新,出现 0x80070643 错误

出现这个问题的原因在于系统分配的“恢复分区”空间不足&#xff0c;该更新在安装时会失败。大致的思路是利用dispart工具收缩C盘空间&#xff0c;扩展该分区的空间。本人开始的“恢复分区”的空间是603MB&#xff0c;安装更新失败&#xff0c;扩充了250MB后&#xff0c;成功了…

基于springboot+mybatis调用MySQL存储过程

前言&#xff1a; 很多公司一般不使用JAVA写存储过程&#xff0c;因为写法较为复杂&#xff0c;不方便后期维护。 不排除一些公司项目会使用。 如果索引优化已经达到很好的性能&#xff0c;不建议使用。以下示例供学习参考&#xff1a; demo源码&#xff1a;https://gitee.com…

一文彻底搞懂进程间通信方式

文章目录 1. 进程间通信的概念2. 进程间通信的7种方式2.1 管道/匿名管道(pipe)2.2 有名管道(FIFO)2.3 信号(Signal)2.4 消息(Message)队列2.5 共享内存(share memory)2.6 信号量(semaphore)2.7 套接字(socket) 1. 进程间通信的概念 每个进程各自有不同的用户地址空间&#xff…

由浅到深认识C语言(14):枚举

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

操作系统系列学习——进程同步与信号量

文章目录 前言进程同步与信号量 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈…

存内领域前沿,基于忆阻器的存内计算----浅析忆阻存内计算

目录 一.概念浅析 1.存内计算 2.忆阻器 3.基于忆阻器的存内计算 二.忆阻器的分类 1.磁效应忆阻器 2 .相变效应忆阻器 3 .阻变效应忆阻器 三.基于忆阻器的存内计算原理 1. 利用二值忆阻器的布尔计算 3.1R-R 逻辑运算 3.2V-R 逻辑运算 3.3V-V 逻辑运算 2. 利用模拟…

GPU密集型计算性能优化的方法和技术

对GPU密集型计算进行性能优化的方法和技术多种多样。通过一些优化策略和技术需要综合考虑应用程序的具体需求、所使用的GPU硬件、以及编程模型和库的选择。通过不断地分析和调整&#xff0c;可以实现GPU计算性能的持续提升。以下是一些常用的优化策略和技术&#xff1a; 算法优…

Nacos注册中心与配置管理

Nacos注册中心与配置管理 1 Nacos注册中心1.1.认识Nacos1.2.服务注册到nacos1.3.服务分级存储模型1.4.权重配置1.5.环境隔离1.6.Nacos与Eureka的区别 2 CAP3.Nacos配置管理3.1.统一配置管理3.2.bootstrap了解3.3.配置热更新3.4.配置共享 1 Nacos注册中心 1.1.认识Nacos 国内公…

main方法语法

main方法语法 深入理解main方法main特别说明在idea中main动态传值 深入理解main方法 解释 main 方法的形式&#xff1a;public static void main&#xff08;String[ ] args&#xff09;{ } 1) main 方法时虚拟机调用&#xff1b; 2) java虚拟机需要调用类的 main() 方法&…

免费开源:自动会议记录接口调用|语音识别接口|语音识别API

一、开源项目介绍 一款多模态AI能力引擎&#xff0c;专注于提供自然语言处理&#xff08;NLP&#xff09;、情感分析、实体识别、图像识别与分类、OCR识别和语音识别等接口服务。该平台功能强大&#xff0c;支持本地化部署&#xff0c;并鼓励用户体验和开发者共同完善&#xf…

【Linux】进程间通信2(共享内存||消息队列)

共享内存 介绍 1.共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 2.当共享内存创建出来后&#xff0c;通过系统调用挂接到…