基础知识学习 -- qnx 系统

news2024/11/19 1:56:11
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.coloradmin.cn/o/1525670.html

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

相关文章

鸿蒙开发实战:【Faultloggerd部件】

theme: z-blue 简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native In…

jupyter notebook使用教程

首先是打开jupyter notebook 下载安装好之后&#xff0c;直接在命令行中输入‘jupyter notebook’即可跳转到对应页面 还可以进入想要打开的文件夹&#xff0c;然后再文件夹中打开中断&#xff0c;执行‘jupyter notebook’命令&#xff0c;就能够打开对应文件界面的jupyter …

Leetcode 202.快乐数 JAVA

题目 思路 要注意题目中说的无限循环&#xff1a;它是指在求平方和的过程中&#xff0c;会再次出现之前的值&#xff08;想象一个圈&#xff09;&#xff0c;这种情况的时候肯定算不出1来。 所以我们要设定跳出循环的条件是&#xff1a;当平方和结果为1或者出现循环了 出现循…

数字逻辑-时序逻辑电路二——沐雨先生

一、实验目的 &#xff08;1&#xff09;熟悉计数器的逻辑功能及特性。 &#xff08;2&#xff09;掌握计数器的应用。 &#xff08;3&#xff09;掌握时序逻辑电路的分析和设计方法。 二、实验仪器及材料 三、实验原理 1、集成4位计数器74LS161&#xff08;74LS160&#…

区块链宣传推广文案怎么写 区块链宣传推广文案的写作技巧

区块链宣传推广文案的写作技巧 随着区块链技术的不断发展和应用&#xff0c;区块链项目的宣传推广变得越来越重要。而撰写有效的区块链宣传推广文案&#xff0c;则是吸引目标受众关注的关键。下面是一些区块链宣传推广文案的写作技巧&#xff1a; 1. 简明扼要的标题&#xff1…

Docker进阶教程 - 2 Docker部署SpringBoot项目

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 2 Docker部署SpringBoot项目 已经学习了 Dockerfile 了&#xff0c;下面介绍一下如何将 SpringBoot 项目通过 Dockerfile 来部署到 Docker 中。 1 修改项目配置 首先需要准备一个 SpringBo…

c++算法学习笔记 (9) 双指针

1.最长连续不重复子序列 给定一个长度为 n 的整数序列&#xff0c;请找出最长的不包含重复的数的连续区间&#xff0c;输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数&#xff08;均在 0∼10^5 范围内&#xff09;&#xff0c;表示整数序列。 输出格式 …

初识Java篇(JavaSE基础语法)(1)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言&#xff1a; 初识Java 运行Java程序 注释 标识符 关键字 数据类型与变量 字面常量 数据类型 变量 类型转换 类型提升 字…

基于springboot在线博客系统源码和论文

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要…

Git Bash命令初始化本地仓库,提交到远程仓库

git init&#xff1a;初始化空仓库 // 初始化一个空仓库或者重新初始化一个存在的仓库 git init git remote // 为当前本地仓库添加一个远程仓库地址 git remote add origin https://gitee.com/xxx/demo.git git pull // 从设置好链接的远程仓库拉去已经存在的数据&#xff0c;…

疯狂送树莓派Pico!与CODESYS和上海晶珩一起,探索慕尼黑上海电子展!

3月20日-3月22日 上海新国际博览中心 E2馆 2200展 上海晶珩 X CODESYS 与您相约慕尼黑上海电子展 上海晶珩&#xff08;EDATEC&#xff09;荣幸宣布&#xff0c;将与全球自动化软件领导者CODESYS公司共同参展2024慕尼黑上海电子生产设备展&#xff01; 届时&#xff0c;我…

【数据结构】二叉树的相关操作以及OJ题目

文章目录 1. 二叉树2.二叉树的遍历2.1前序遍历2.2中序遍历2.3后序遍历2.4层序遍历 3.树的节点个数4.树的高度5.叶子节点的个数6.第k层节点的个数7.查找x所在的节点8.树的销毁9.相关题目9.1相同的树9.2单值二叉树9.3对称二叉树9.4二叉树的构建9.5翻转二叉树9.6另一颗树的子树 10…

Learn OpenGL 17 立方体贴图

立方体贴图 我们已经使用2D纹理很长时间了&#xff0c;但除此之外仍有更多的纹理类型等着我们探索。在本节中&#xff0c;我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型&#xff1a;立方体贴图(Cube Map)。 简单来说&#xff0c;立方体贴图就是一个包含了…

Java基础夯实——八股文【2024面试题案例代码】

1、Java当中的基本数据类型 Java中常见的数据类型及其对应的字节长度和取值范围如下&#xff1a; byte&#xff1a;1字节&#xff0c;取值范围为-128到127。short&#xff1a;2字节&#xff0c;取值范围为-32,768到32,767。int&#xff1a;4字节&#xff0c;取值范围为-2,147…

【Greenhills】GHS-MULTI IDE-Ubuntu纯命令系统部署license文件

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 记录在Ubuntu纯命令系统中部署license文件的步骤。 2、 问题场景 客户服务器为Linux纯命令行的环境&#xff0c;客户也无其他服务器可以部署&#xff0c;需在纯命令行上尝试安装。 3、软硬件环境 1&#xff09…

【Linux系统编程】进程程序替换

介绍&#xff1a; 进程程序替换是指将一个进程中正在运行的程序替换为另一个全新的程序的过程&#xff0c;但替换不是创建新进程&#xff0c;只是将对应程序的代码和数据进行替换。具体来说&#xff0c;这个替换过程涉及将磁盘中的新程序加载到内存结构中&#xff0c;并重新建立…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FlowItem)

瀑布流组件的子组件&#xff0c;用来展示瀑布流具体item。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。仅支持作为Waterflow组件的子组件使用。 子组件 支持单个子组件。 接口 FlowItem() 使…

【RK android6.0 实现假关机真开机效果】

RK android6.0 实现假关机真开机效果 需求描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip CPU:rk3368 OS:Android 7.1.2 Kernel: 3.10 需求描述 由于硬件设计&#xff0c;使用错误…

Qt实现简单的五子棋程序

Qt五子棋小程序 Qt五子棋演示及源码链接登陆界面单机模式联机模式联网模式参考 Qt五子棋 参考大佬中国象棋程序&#xff0c;使用Qt实现了一个简单的五子棋小程序&#xff0c;包含了单机、联机以及联网三种模式&#xff1b;单机模式下实现了简易的AI&#xff1b;联机模式为PtoP…

Verilog case/casez/casex的区别

casez/casex语句虽然EDA工具也可以综合出来&#xff0c;但是注意&#xff0c;casez/casex综合出来的电路和case语句综合出来的电路可能是不同的&#xff0c;一定要慎用。而且综合工具也会告诉你casez/casex中的“?”"x""z"的comparison is always false&a…