image frame

星际旅行日志

彼汾一曲,言采其藚.彼其之子,美如玉.美如玉,殊异乎公族.

FPAG DDR2 SDRAM程序分析

一、ddr_test.v

状态机切换:

state=IDLE , next_state=MEM_WRITE

wr_burst_addr=25'd0;
wr_burst_req <= 1'b1;      //产生ddr burst写请求       
wr_burst_len <= 10'd255;
wr_cnt <= 10'd0;

/*burst读长度*/	
always@(posedge	mem_clk)
	begin
		if(state == IDLE && rd_burst_req)
			length <= rd_burst_len;
		else
			length <= length; 
	end
阅读更多...

Linux设备驱动程序(第一章 设备驱动程序简介)

第一章 设备驱动程序简介

设备驱动程序是进入Linux内核世界的大门。

设备驱动程序在Linux内核中扮演着特殊的角色,它们是一个个独立的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。将这些调用映射到作用于实际硬件的设备特有操作上,则是设备驱动程序的任务

这个编程接口能够使得驱动程序独立于内核的其他部分而建立,必要的情况下可在运行时“插入”内核。这种模块化的特点使得编写Linux驱动程序变得简单,因此内核驱动程序的数目也迅速增长。

本文中采取独立于硬件的方法讲述有关驱动程序编程方法以及内核的相关知识,所讲述的编程技巧和接口尽可能不依赖任何具体设备。

设备驱动程序的作用

作为驱动程序编写者,需要在所需的编程时间以及驱动程序的灵活性之间选择一个可接受的折中。强调驱动程序的灵活性实际上是强调设备驱动程序的作用在于提供机制,而不是提供策略。

大多数编程问题实际上都可以分为两部分:“需要提供什么功能”(机制)“如何使用这些功能”(策略)

驱动程序同样存在机制和策略的分离问题。不同的环境通常需要不同的方式来使用硬件,我们应当尽可能做到让驱动程序不带策略。

编写驱动程序时,程序员应该特别注意以下概念:编写访问硬件的内核代码时,不要给用户强加任何特定策略。因为不同的用户有不同的需求,驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用程序。

从另一个角度,驱动程序还可以看做是应用程序和实际设备之间的一个软件层。这种特性可以让编写者选择如何展现设备特性,也就是说,即使对于相同的设备,不同的驱动程序可能提供不同的功能

驱动程序设计主要综合考虑以下三个方面的因素:

  • 提供给用户尽可能多的选项
  • 编写驱动程序要占用的时间
  • 尽量保持程序简单而不至于错误丛生

不带策略的驱动程序包含一些典型的特征:

  • 同时支持同步和异步操作
  • 驱动程序能够被多次打开
  • 充分利用硬件特性
  • 不具备用来“简化任务”的或提供与策略相关的软件层等

不带策略是软件设计者的一个共同目标


内核功能划分

Unix系统支持多个进程的并发运行,每个进程都请求系统资源,比如运算、内存、网络、连接或者其他一些资源等。内核负责处理所有这些请求,根据内核完成任务的不同,可将内核功能分成如下几个部分

  • 进程管理

  • 内存管理

  • 文件系统

  • 设备管理

  • 网络功能

    image-20220122110206581


可装载模块

Linux有一个很好的特性:内核提供的特性可在运行时进行扩展。意味着当系统启动并运行时,我们可以向内核添加功能。

可以在运行时添加到内核中的代码被称为“模块”。

Linux内核支持好几种模块类型(或者类),包括但不局限于设备驱动程序。每个模块由目标代码组成(没有链接成一个完整的可执行程序),我们可以使用insmod程序将模块连接到正在运行的内核,也可以使用rmmod程序移除连接。

设备和模块的分类

Linux系统将设备分成三种基本类型,每个模块通常实现为其中某一类:

  • 字符模块
  • 块模块
  • 网络模块

然而这种将模块分为不同类型或类的分类方式并不是非常严格,程序员可以构造一个大的模块,在其中实现不同类型的设备驱动程序。然而,优秀的程序员通常还是为每个新功能创建一个不同的模块,从而实现良好的伸缩性和扩展性。

这三种类型如下:

  • 字符设备

    字符(char)设备是个能够向字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。

  • 块设备

    和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。块设备(例如磁盘)上能够容纳文件系统。在内核中,和字符设备相比,块设备驱动程序具有完全不同的接口。

  • 网络接口

    任何网络事务都经过一个网络接口形成,即一个能够和其他主机交换数据的设备。通常接口是个硬件设备但也可能是个纯软件设备,比如回环(loopback)接口网络接口由内核中的网络子系统驱动,负责发送和接收数据包,但它不需要了解每项事务如何映射到实际传送的数据包。

    许多网络连接(尤其是使用TCP协议的连接)是面向流的,但网络设备却围绕数据包的传输和接收而设计。网络驱动程序不需要知道各个连接的相关信息,它只要处理数据包即可。

    由于不是面向流的设备,因此将网络接口映射到文件系统中的节点比较困难。Unix访问网络接口的唯一方法是给他们分配一个唯一的名字(如eth0),但是这个名字在文件系统中不存在对应的节点。

另外一种划分驱动程序模块类型的方法。一般,某些驱动程序类型,同,内核用来支持某种给定类型设备的附加层,一起工作。比如:通用串行总线(USB)模块、串行模块、SCSI模块,等等。

每个USB设备由一个USB模块驱动,而该USB模块与USB子系统一同工作,但设备本身在系统中表现为一个字符设备(比如USB串口)、一个块设备(比如USB存储卡读取器),或者一个网络设备(比如USB以太网设备接口)。

一个文件系统类型决定了如何在块设备上组织数据,以表示目录和文件形成的树。

文件系统并不是设备驱动程序;相反,文件系统类型是个软件驱动程序,它将低层数据结构映射到高层数据结构,决定文件名可以有多长以及在目录项中存储文件的哪些信息等等。

安全问题

系统中所有的安全检查都是由内核代码进行的,如果内核有安全漏洞,则整个系统就会有安全漏洞。

在正式发行的内核版本中,只有授权用户才能装载模块;也就是说,系统调用init_moudle检查调用进程是否具有将模块装载到内核的权利。因此,运行正式发布的内核时,只有超级用户或者成功成为超级用户的入侵者才能使用特权代码。

  • 驱动程序编写者应当尽量避免在代码中实现安全策略。安全策略问题最好在系统管理员的控制之下,由内核的高层实现。
  • 驱动程序编写者还应该避免由于自身原因引入安全方面的缺陷。例如避免缓冲区溢出,覆盖系统中的其他数据导致危及整个系统的安全。
  • 任何从用户进程得到的输入只有经过内核严格验证后才能使用。必须小心对待未初始化的内存:任何从内核中得到的内存,都必须在提供给用户进程或者设备之前清零或者以其他方式初始化,否则可能发生信息泄露。
  • 应当考虑设备操作造成的影响,如果某些特定操作可能会影响整个系统,则应当将此类操作限于特权用户。
  • 小心使用从第三方获得的软件,特别是与内核相关的。例如一个恶意修改过得到内核可能会允许任何人装载模块,这样,一扇通过init_module的后门就打开了。
  • Linux内核也可以编译为不支持模块方式,从而可以关闭任何模块相关的安全漏洞。但在这种情况下,所有所需的驱动程序必须直接编译到内核中。

版本编号

Linux系统中的每个软件包都有自己的发行编号,而且他们之间经常存在相互间的依赖关系,也就是说,只有存在某个软件包的特定版本时,才能运行另一个软件包的特定版本。

对内核来说,偶数编号的内核版本(如2.6.x)是用于正式发行的稳定版本,而奇数编号的版本(如2.7.x)则是开发过程中的一个快照,它将很快被下一个开发版本更新,最新的开发版本只是代表了内核开发目前的状态,几天后可能就会过时。

本书中描述内核的2.6版本,主要在于向读者展示2.6.10内核中有关设备驱动程序编写的所有可用功能特性。


许可证条款

image-20220122233214541

HarmonyOS设备开发工程师七(HarmonyOS移植)

本文源于HarmonyOS官方教程https://developer.huawei.com/consumer/cn/training/course/introduction/C101635908637340943

如有侵权,联系helloc2333@163.com删除。

HarmonyOS移植


适用于不同场景的物联网设备可能基于各种芯片架构,而开发者期望能使用一个统一的操作系统对所有设备进行控制。

HarmonyOS 可以运行在不同体系架构的处理器和开发板上。一般情况下,操作系统的编写者通常不会一次性完成整个操作系统的代码,而是会把一部分与具
体硬件设备相关的代码作为抽象的接口保留出来,这样可以保证整个操作系统的可移植性。

为什么要移植操作系统?

移植可以有效的降低开发的适配成本。

image-20220104094939986

嵌入式软件系统的组成:Windows VS HarmonyOS

image-20220104095436427

操作系统移植步骤

  • 环境准备

    移植系统前需要进行一系列准备工作,包括下载源码、建立交叉编译环境等。

  • BootLoader移植

    引导加载程序(BootLoader)是设备上电后运行的第一个程序。在完成环境准备之后,需要对BootLoader移植。

  • 编译内核

    在完成BootLoader的移植后,需要对操作系统内核进行配置和编译,如有必要,还需要对源码做一定的修改。

  • 根文件系统制作

    制作根文件系统,并将程序、库、配置文件等文件放入根文件系统中进行调用。如有需要,用户数据和驱动程序也可放入根文件系统。

移植场景对比

image-20220104100638459


系统移植基本知识

编译环境简介:本地编译

  • 对于常见的软件开发,尤其是非嵌入式开发,基本都采用本地编译的方式。本地编译是指在当前的PC中直接编译出来程序或者库文件,这程序或库文件可以直接在当前的环境中运行。
  • 所谓的本地编译,就是在当前目标平台中完成了编译和运行,在这个过程中不需要考虑跨设备与跨平台的情况。

image-20220104101049911

交叉编译

  • 交叉编译是一个和本地编译相对应的概念。
  • 交叉编译是在一种平台上编译,编译出来的程序或者库文件放到别的平台上运行。编译的环境和运行的环境不一样,这称之为交叉
  • 交叉编译这个概念主要和嵌入式开发有关。

image-20220104101422643

为什么需要交叉编译?

  • 主要原因:嵌入式系统中的资源有限。
  • 对于需要进行交叉编译的嵌入式系统而言,由于本地各种资源十分有限,难以进行本地编译。

交叉工具链

  • 交叉工具链是为了达成交叉目的以及生成可运行的程序和库文件所使用的工具链。
  • 交叉工具链内部的执行过程和逻辑主要包含了两个方面:编译和链接

image-20220104101901448

程序编译步骤

image-20220104102020768

编译构建工具-Make

  • 一个C语言源文件从源文件到目标文件的过程叫做编译,但是一个项目中可能存在多个源文件。这就涉及到多个文件的编译顺序问题,程序构建过程就是安排文件的编译先后顺序。
  • Make是一种构建工具,它属于GNU项目。Make命令执行时,需要一个Makefile文件告诉make命令如何去编译和链接程序。在执行make命令的过程中,make会自动查找Makefile文件并执行,这就避免了开发者一步步的手动编译文件。

编译构建工具- Cmake

  • 虽然Make和Makefile简化了手动构建的过程,但是编写Makefile文件仍然有些麻烦,为了进一步简化编译构建的工作,就有了Cmake工具。
  • CMake工具可以通过CMakeLists.txt文件生成Makefile文件,CmakeList.txt的编写难度较Makefile文件的编写有显著的降低。

image-20220104102900674

第三方库移植

什么是库?

  • 库的本质是可执行代码的二进制形式,库文件可以在编译时由编译器直接链接到可执行程序中,也可以在运行时由操作系统的运行环境根据需要动态加载到内存中。
  • 一组库可以形成了一个发布包,具体发布多少个库完全由库的提供商决定。
  • 现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
  • 在 C 语言中, C 标准库是一组 C 内置函数、常量和头文件,例如 <stdio.h> , <stdlib.h> ,<math.h> 等等。这个标准库可以作为 C 程序员的参考手册。

CMake方式库移植-源码目录结构

以完成双精度进制双向转换的 double-conversion 库为例,其部分源码目录结构如下:

image-20220104103343550

CMake 方式库移植 - 移植思路

  • 移植思路:

    通过修改工具链,交叉编译该三方库,生成 HarmonyOS 平台的可执行文件,最后再通过 GN 调用 CMake 的方式添加到 HarmonyOS 工程中。

image-20220104103547166

Makefile 方式库移植 - 源码目录结构

以第三方库 XML 解析器 yxml 为例,其部分源码目录结构如下:

image-20220104105549038

Makefile 方式库移植 - 移植思路

移植思路:

Makefile 方式的库移植思路与 CMake 类似,主要的区别在于 CMake 方式通过修改 CMakeLists.txt 设置工具链,而 Makefile 方式需要自行手动修改 Makefile 文件进行工具链设置,除此之外,在将库添加至工程时创建的适配文件 BUILD.gn 和 condig.gni 与 CMake 方式有区别,其他完全一致。

image-20220104105903310

HarmonyOS设备开发工程师五(扩展子系统开发)

本文源于HarmonyOS官方教程https://developer.huawei.com/consumer/cn/training/course/introduction/C101635908637340943

如有侵权,联系helloc2333@163.com删除。

扩展子系统开发

HarmonyOS 除了基础子系统之外,为了一些特殊的使用场景,划分了拓展子系统。拓展子系统包括:

图形图像子系统,媒体子系统, AI 框架子系统, Sensor服务框架与用户服务框架,安全子系统,测试子系统, DFX 与 XTS 。

图形图像子系统

HarmonyOS 的图形图像子系统主要功能:

  • 提供了基础 UI 组件和容器类组件。包括 button (按钮)、 image (图片)、 label (标签)、list (列表)、 animator (动画)、 scroll view (滚动条)、 swipe view (滑动视图)、 font(字体)、 clock (时钟)、 chart (图表)、 canvas (画布)、 slider (滑块)、 layout (布局)等。
  • 提供截屏、导出组件树的能力。
  • 模块内部实现组件渲染、动画、输入事件分发等功能。

UI组件与布局

UI 组件:

  • 实现各种控件,如按钮、文本、进度条等各种基本控件。
  • 提供界面切换、图片序列帧等复杂控件。

布局:

  • 实现栅格布局、灵活布局(如居中、左对齐、右对齐)。
  • 布局为一次性布局。布局函数每运行一次,会计算一次控件的位置,但是控件位置由其他方式改变时(如拖动),其他相关联的控件位置不会自动发生变化,需要重新调用一次布局函数。

动画与输入事件

动画:

根据 tick (时钟滴答)事件,由 Task Manager 周期性调用回调函数处理属性变化,然后触发刷新重新绘制组件,达到组件动画效果。
提供动画的开始 / 停止、暂停 / 恢复、创建 / 销毁等各种操作 ,用于实现动画效果。

Input 事件:

Input 事件包括触摸屏触摸输入事件和物理按键输入事件, GUI ( Graphical User Interface ,图形用户界面)引擎每运
行一次, Input Manager 会读取一次所有注册的硬件设备的输入,转化为各种事件供 UI 控件使用。

渲染:

2D 图形渲染实现线、矩形、三角形、弧线的绘制操作。图像渲染实现各种类型图片的绘制 API ,如 RGB565 、 RGB888 、 ARGB8888 、 PNG 、 JPG 格式。
字体渲染支持矢量字体(通过数学曲线描述的字形)的实时绘制。

媒体子系统开发场景

某开发人员希望能开发一套摄像和视频播放的应用。基础功能需要满足视频拍摄和视频播放以及视频播放过程的控制。

image-20220101195732262

媒体子系统 - 相机开发

相机是HarmonyOS多媒体进程提供的服务之一,提供了相机的录像、预览、拍照功能,支持多用户并发取流。

基本概念:

视频帧:每一张图片数据称为一帧,这样的一帧称为视频帧。
视频流:一系列图片数据按照固定时间间隔排列形成的数据流。
帧速率(FPS: Frames Per Second):视频播放每秒钟刷新图片的速度,或是视频每秒的帧数。
分辨率:每一帧的图片信息都是由像素点组成的,
分辨率描述了一张图片中像素点的个数
。例如1920x1080(1080P)。

媒体子系统 - 音视频开发

HarmonyOS音视频包括音视频播放录制

  • HarmonyOS音视频播放模块:包括音视频文件和音视频流播放、音量和播放进度控制功能。
  • HarmonyOS录制模块:提供音视频录制相关的功能,包括设置录制视频画面尺寸音视频编码码率编码器类型视频帧率音频采样率录制文件输出格式相关功能。

image-20220101200301046

音视频开发基本概念

流媒体技术:把连续的影像和声音信息进行编码处理后放在网络服务器上,让浏览者一边下载、一边观看与收听,而不需要等整个多媒体文件下载完成就可以即时观看、收听的技术。
码率:数据传输时单位时间内传送的数据位数,常用单位是kbps即千位每秒。
**采样率(Hz)**:每秒从连续信号中提取并组成离散信号的采样个数。采样率越高,声音的还原就越真实自然。

AI框架是什么?

AI 框架定义: HarmonyOS 提供原生的分布式 AI 能力的子系统。

AI 框架功能:提供统一的 AI 引擎框架,实现算法能力快速插件化集成

AI 框架的组成:

image-20220101204925468

AI框架详细结构

image-20220101205831377

AI框架运行机制

AI 引擎框架包含 clientservercommon三个主要模块。

  • client 提供 server 端连接管理功能;
  • server 提供插件加载以及任务管理等功能,各 plugin 实现由 server 提供的插件接口,完成插件接入;
  • common 提供与平台相关的操作方法、引擎协议以及相关工具类,供其他各模块调用。

image-20220101210411479

Sensor 服务框架与用户程序框架

Sensor服务是什么?

Sensor 是一个轻量级传感器服务框架

Sensor 提供了轻量级传感器服务基础框架,可以使用该框架接口实现传感器列表查询传感器控制传感器订阅去订阅等功能。

image-20220101211710225

Sensor服务框架结构

轻量级传感器服务框架如图所示:

Sensor API:提供传感器的基础API。主要包含查询传感器的列表、订阅/取消传感器数据、执行控制命令等,简化应用开发。

Sensor Framework:主要实现传感器的订阅管理、数据通道的创建、销毁等,实现与传感器服务层的通信。

Sensor Service:主要实现HDF层数据接收、解析、分发,对设备传感器的管理,数据上报管理以及传感器权限管控等。

image-20220101212159529

用户程序框架结构

Ability:系统调度应用的最小单元,是能够完成一个独立功能的组件,一个应用可以包含一个或多个Ability。Ability分 为 两 种 类 型 : Page 类 型 的 Ability 和Service类型的Ability。

  • Page类型的Ability:带有界面,为用户提供人机交互的能力。
  • Service类型的Ability:不带界面,为用户提供后台任务机制。

image-20220101213546053

安全与测试

软件安全的重要性

如果用户使用的软件缺乏必要的安全保障,那么会发生什么?

场景:某用户甲想要将运动手环A的体温数据Data1发送到手机上。

image-20220101214106789

异常场景:

 场景1:用户乙将运动手环A的数据Data1发送到手机上。
 场景2:用户甲将冰箱的温度Data2发送到手机上。
 场景3:用户甲将运动手环A的数据Data1发送到电视上。

HarmonyOS 安全子系统

HarmonyOS安全子系统目前提供给开发者的安全能力主要包含应用可信权限管理设备可信

image-20220101214331204

安全子系统限制

仅支持以下三类应用的验签:应用市场调试应用应用市场发布应用HarmonyOS自签名应用的验签

若对应用市场调试应用验签,则本机UDID需要在描述文件包含的UDID列表中。

待上架应用无法验签通过。

验签组件提供的接口都位于security_interfaces_innerkits_app_verify仓app_verify_pub.h中,仅支持系统应用开发者调用。

可信设备群组管理接口,目前只对系统签名权限才可以使用。

测试子系统是什么?

测试子系统提供基于 Python 开发的一键式的开发者自测试平台,支持跨平台使用以及三方测试框架拓展,主要包括测试用例编译、测试用例管理、测试用例调度分发、测试用例执行、测试结果收集、测试报告生成、测试用例模板、测试环境管理等模块。

约束与限制:

功能使用范围:开发自测试平台仅支持代码级的测试用例开发和验证,如单元测试,模块测试。

规格限制:当前测试框架的适用范围仅支持白盒测试。

操作限制:一台测试设备上仅支持启动单个测试平台。

测试子系统架构

image-20220101220601670


DFX 与 XTS

DFX 是什么?

DFX(Design for X)是为了提升质量属性软件设计。包含两个内容主要:

  • DFR(Design for Reliability,可靠性)。
  • DFT(Design for Testability,可测试性)。

image-20220101220922170

DFX 的几个基本概念

流水日志:流水日志是系统运行过程中产生的一些日志信息,用于开发人员了解系统或应用运行过程、状态。

分布式跟踪

  • 在一个分布式系统中,一次业务的发起往往会经历多个软件模块,通过进程内、进程间、设备间的通信接口进行控制和数据传递。
  • DFX提供的分布式跟踪框架可以便于开发人员对这类复杂流程的问题跟踪定界。

线程卡死故障

  • 线程在运行过程中,如果进入死循环,或者陷入内核态,将无法响应正常的业务请求,且无法自己恢复。
  • 通过watchdog机制,在易于发生卡死的流程中插入检测点,对于卡死故障可进行故障恢复和日志采集

XTS 是什么?

XTS子系统是HarmonyOS生态认证测试套件的集合,当前版本可使用acts(application compatibility test suite)应用兼容性测试套件。

XTS主要功能:帮助终端设备开发者尽早明确软件与HarmonyOS的兼容性

image-20220101222350236

XTS 设备类型

HarmonyOS支持以下两种设备类型:

image-20220101222549402

HarmonyOS设备开发工程师六(Shell功能调测)

本文源于HarmonyOS官方教程https://developer.huawei.com/consumer/cn/training/course/introduction/C101635908637340943

如有侵权,联系helloc2333@163.com删除。#

功能调试


软件调测的价值与意义

在硬件设备开发完成之后,需要对开发完成的软件进行测试验证,确保软件的功能正确。

image-20220101230808829

Shell 命令是 HarmonyOS 设备开发常用的调测工具

Shell 命令的常用功能

HarmonyOS 内核提供的 Shell 支持调试常用的基本功能,包含系统、文件、网络和动态加载相关命令。

同时 HarmonyOS 内核的 Shell 支持添加新的命令,可以根据需求来进行定制。

image-20220101230945068

Shell 命令注意事项

  • Shell功能支持Shell命令、文件名及目录名的Tab键联想补全。

  • Shell端工作目录与系统工作目录是分开的,即通过Shell端cd、pwd等命令是对Shell端工作目录进行操作,通过chdir、getcwd等命令是对系统工作目录进行操作,两个工作目录相互之间没有联系。

  • 在使用网络Shell指令前,需要先调用tcpip_init函数完成网络初始化并完成telnet连接后才能起作用,内核默认不初始化tcpip_init。

    不建议使用Shell命令对/dev目录下的设备文件进行操作。

Shell命令编程实例

新增Shell命令的典型开发流程如下:

image-20220104090708297

静态注册参数介绍:

  • 宏的原型为: SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook) 。

例如:

  • SHELLCMD_ENTRY(ls_shellcmd, CMD_TYPE_EX, “ls”, XARGS, (CMD_CBK_FUNC)osShellCmdLs)

image-20220104091020285

  • 定义一个新增命令所要调用的执行函数cmd_test。
#include "shell.h"
#include "shcmd.h"
int cmd_test(void)
{
    printf("hello everybody!\n");
    return 0;
}
  • 新增命令项:
SHELLCMD_ENTRY(test_shellcmd, CMD_TYPE_EX, "test", 0, (CMD_CBK_FUNC)cmd_test);
  • 在链接选项中添加链接该新增命令项参数:
在liteos_tables_ldflags.mk文件的LITEOS_TABLES_LDFLAGS项下添加-utest_shellcmd。
  • 重新编译代码:
make clean
make
  • 用help命令查看当前系统所有的注册命令,可以发现test命令已经注册。
OHOS # help
*******************shell commands:*************************
arp
cat
cd
chgrp chmod chown
date
dhclient dmesg dns
format free
Ifconfig ipdebug kill
log
ls
lsfd
mount netstat oom
partinfo partition
reset
rm
rmdir
sem
statfs
su
systeminfo
task
telnet test
tftp
watch writeproc

动态注册参数介绍

  • 函数原型 UINT32 osCmdReg(CmdType cmdType, CHAR *cmdKey, UINT32 paraNum,CmdCallBackFunc cmdProc) 。

例如:

osCmdReg(CMD_TYPE_EX, “ls”, XARGS, (CMD_CBK_FUNC)osShellCmdLs)
  • osCmdReg 参数详解:

    image-20220104091815479

  • 动态注册方式实例

在用户应用函数中调用osCmdReg函数动态注册命令.

#include "shell.h"
#include "shcmd.h"
int cmd_test(void)
{
    printf("hello everybody!\n");
    return 0;
}
void app_init(void)
{
    ....
    ....
    osCmdReg(CMD_TYPE_EX, "test", 0,(CMD_CBK_FUNC)cmd_test);
    ....
}
  • 重新编译代码:

    make clean
    make
  • 用help命令查看当前系统所有的注册命令,可以发现test命令已经注册,执行效果与静态注册一致。
OHOS # help
*******************shell commands:*************************
arp
cat
cd
chgrp chmod chown
date
dhclient dmesg dns
format free
Ifconfig ipdebug kill
log
ls
lsfd
mount netstat oom
partinfo partition
reset
rm
rmdir
sem
statfs
su
systeminfo
task
telnet test
tftp
watch writeproc

Shell命令

系统命令

  • cpup

    用于查询 cpu 占用率。命令格式: cpup [mode] [taskID] 。例如:

    image-20220104092637746

  • date

    用于查询与设置系统日期时间。例如:

image-20220104092729481

  • exec

    用于执行用户态程序的功能。

  • hwi

    用于显示中断信息。

  • kill

    发送特定信号给指定进程。命令格式: kill [signo / -signo] [pid] 。

  • log

    用于修改 & 查询日志配置。命令格式: log level [levelNum] 。

  • memcheck

    检查动态申请的内存块是否完整,是否存在内存越界造成节点损坏。

  • reset 命令用于重启设备。

文件命令

  • cat 用于显示文本内容。
  • cd 用于切换目录, cd .. 可以回退到上一目录。
  • chmod 用于修改文件操作权限。命令格式: chmod [mode] [pathname] 。
  • cp 用于拷贝文件。命令格式: cp [source file] [destination file] 。
  • ls 用于显示目录内容,命令格式: ls [path] , path 为空表示当前目录。
  • mkdir 命令用来创建一个目录,命令格式: mkdir [directory] 。
  • mount 命令用来将设备挂载到指定目录。
  • pwd 命令用来显示当前路径
  • rm 命令用来删除文件或文件夹,命令格式: rm [-r] [dirname / filename] , -r 为可选参数,如果需要删除目录则需要此参数。
  • rmdir 只能用于删除目录,且一次操作只能删除一个空目录。
  • touch 命令用来在指定的目录下创建一个不存在的空文件,如果是操作已经存在的文件,则不会更新时间戳。命令格式: touch [filename] 。

网络命令

  • arp 用于查询 ARP 缓冲, ARP 缓冲存储了 IP 与 MAC 的对应表。
  • dhclient 设置和查看 dhclient 的参数。
  • dns 用于查看和设置单板 dns 服务器地址。
  • netstat 用于检验本设备各端口信息。
  • ping 用于检验网络连接情况。

Ubuntu+Windows双系统无法写入硬盘

文章转载于:https://www.cnblogs.com/Eric-jx/p/15321325.html

Ubuntu+Windows双系统无法写入硬盘

问题描述

为了方便开发,几年前在自己笔记本安装了Ubuntu+Windows10双系统,但是随之而来的一个巨大的问题就是:当我在进入Ubuntu系统之后,无法对Windows所在的磁盘分区和其他分区进行文件的写入操作,比如:无法将文件从Ubuntu所在的分区移动或复制到Windows所在的分区,甚至D、E、F盘都不可以。

写这篇文章的目的

当我第一次遇到这个问题的时候,在网上可以找到很多解决方案,但是,基本上都是不太行,甚至误人子弟,各种命令修改磁盘参数啊、修改权限信息啊等等,没有搞清楚问题的根本。这几天突然想起这些事情,随手查阅了一下,发现还是有很多类似的文章,于是我决定写点东西来提醒一下踩坑的人。

正文

为了能更容易懂,我浅显地解释一下为社么在Ubuntu系统内,无法对Windows系统分区进行写操作:

自从Windows更迭到10之后,出现了一个细节方面的功能,就是加快了开机速度,它是如何实现的呢?

当你在开始菜单的左下角选择“关机”之后,Windows并不是完全关机,而是停掉了大部分与系统没多大关系的软件,然后将系统的核心状态“存档”了,类似看电影暂停了,下次再打开能在这个位置继续播放一样,系统将这个“存档”数据从内存拿出来放到硬盘里面,下次开机的时候直接从硬盘里面读取这个“存档”,启动系统的速度会变得快一点。

使用机械硬盘的人应该有这样一种经历:Windows10关机的时候你的硬盘会飞速转动,有的电脑会发出嗡嗡的声音,屏幕都黑了,电源提示灯还没灭,那就是Windows在往硬盘里面“存档”,因为机械盘速度比固态速度慢很多,所以可以看出一点端倪。

这种技术伴随而来的是对硬盘的“写保护”,Windows10在关机之后,它之前所“管辖”的C、D、E盘等分区都会进入一种“权限保护”状态,无法在其它系统对其进行写入操作。

Windows10系统除了“关机”选项,还有一个“重启”选项,注意这个“重启”,它不仅仅是让电脑关机之后自动再开机,上面介绍了Windows10的“关机”过程,看似关机,实则在简单存档,而这个“重启”才是真正的关机,在重启过程中的断电那一刻,才是Windows真正关机的时刻,没有任何的存档,甚至硬盘也没了“写保护”。

所以,在使用Windows10+其他系统的双系统或者多系统的电脑的时候,要注意,从Windows系统切换到其他系统时,不要用“关机”的方式切换,要选择“重启”的方式切换,比如:我现在是Windows10,我要切换到Ubuntu,那我应该选择“重启”,然后等电脑自己断电、自己开机,进入Ubuntu,而不是选择“关机”。

其他的牢骚

既然提到了“存档”的事情,那我再多写一点有关的其他东西。

Windows10除了“关机”、“重启”,还有个“睡眠”,这个可能大部分人比较熟悉,类似息屏,电脑一直在运转,只不过屏幕灭了,是持续费电的。

Windows10还有个“休眠”选项,需要在控制面板里面开启,才能在关机按钮旁边看到,我上面提到了“简单存档”,“关机”就是“简单存档”,只把核心部分进行保存,并断电关机,而这个“休眠”,是“完全存档”,它会把Windows10的当前状态100%保存,举个例子:我正在写文档,word是打开状态,后台还运行着QQ微信,并且是登录状态;我此时选择“休眠”,电脑会用好几秒甚至更长的时间进行关机,然后电源提示灯也灭了,与关机没区别,当我下次开机的时候,你会发现,屏幕亮起,输入开机密码之后,映入眼帘的是之前的工作状态,word也在运行,QQ和微信也是原样,就像没关过机一样。

其实这个功能很有用的,很多人不注意,比如,我在忙着写代码,或者正在赶稿子,弄到一半突然有急事要去做,而且会很长时间,那我可以选择“休眠”,那等我办完事回来,按下电源键开机,电脑会把之前的状态100%还原,会省很多事,而且休眠期间是不费电的。

HarmonyOS设备开发工程师四(基础子系统开发)

本文源于HarmonyOS官方教程https://developer.huawei.com/consumer/cn/training/course/introduction/C101635908637340943

如有侵权,联系helloc2333@163.com删除。

基础子系统开发

HarmonyOS 将一些常用的功能划分为独立的子系统,以便于更好的实现相关功能。基础的子系统包括:

  • 编译构建子系统,
  • 分布式远程启动子系统,
  • 公共基础子系统,
  • OTA 升级子系统,
  • 启动恢复子系统,
  • 软总线子系统。

编译构建子系统

编译构建子系统是基于 gn 和 ninja ,支持 OpenHarmony 组件化开发的编译框架,主要提供以下功能:

构建已有产品
独立构建芯片厂商源码
独立构建单个组件。

在开发编译构建前,应了解如下基本概念:
组件:可复用的软件单元,它可包含源码、配置文件、资源文件和编译脚本等。
Ninja : ninja 是一个专注于速度的小型构建系统。
Gn : Generate ninja 的缩写,用于产生 ninja 文件。

Ninja 和 Gn 概述

  • Ninja 是一个致力于速度的小型编译系统(类似于 Make 编译工具)。
  • Ninja 主要有两个特点:
    • 可以通过其他高级的编译系统生成其输入文件。
    • 它的设计就是为了更快的编译
  • Ninja 核心是由 C/C++ 编写的,同时有一部分辅助功能由 python 和 shell 实现,可以利用Ninja 的开源代码进行各种个性化的编译定制。
  • Gn : Generate ninja ,用于产生 ninja 文件。

编译构建流程

image-20211231191009528

设置与编译

hb set 命令功能:设置 HarmonyOS 源码目录要编译的产品

hb build 命令功能:编译产品、开发板或者组件

解决方案编译实现过程:

image-20211231191154527

分布式远程启动

分布式远程启动场景案例

现有如下场景:某用户想看某节目,于是在智慧屏上点击了节目开播后提醒,之后用户去了另一个房间,智慧屏无法直接提醒用户收看节目。

场景条件:智慧屏幕可连接局域网,运动手表只能通过蓝牙连接,用户的手机在房间内充电,用户希望通过运动手表获得提醒。

image-20211231192119826

  • 解决方案:通过分布式软总线的方式,让智慧屏的消息传达到用户的运动手表上,智慧屏远程启动运动手表,给用户做开播提醒。

image-20211231192242838

分布式远程启动是什么?

分布式远程启动由分布式任务调度模块执行,它通过主从设备服务代理机制,在HarmonyOS 操作系统上建立起分布式服务平台,支持主设备(搭载 HarmonyOS 的智慧屏设备)启动从设备( IP Camera 、运动手表等小内存 HarmonyOS 设备) FA ( FeatureAbility )的能力.

基本概念:
FA :代表有界面的 Ability ,用于与用户进行交互。
远程启动:即跨设备启动 FA ,与本地启动 FA 相对应。

远程启动步骤

image-20211231192613394

want参数:远端设备id,包名,ability类名。

// 启动远程设备FA
Want want = new Want();
// 封装启动远端FA的Want
// 使用之前获取的设备ID,并指定FA信息
ElementName name = new
ElementName(remote_device_id,”com.Huawei.remote_package_name”,”remote_class_name”);
want.setElement(name);// 将待启动的FA信息添加到Want中
want.setFlags(Want.FLAG_ABILITYSLICE_MULTI_DEVICE);// 设置分布式标记,若不设置则无法使用分布式能力
startAbility(want);// 按照Want启动指定FA,Want参数命名以实际开发平台的API为准

 支持主设备侧 远程启动 从设备侧 FA ,不支持从设备 远程启动 主设备 FA 。
 远程启动前必须确保设备间分布式组网成功(需要在同一网段内,可互相 ping 通),否则无法远程启动。
 当前只支持拥有共同公钥信息的主从设备间 FA (即主从设备的 FA 使用相同华为证书)的拉起。

公共基础与OTA升级

案例需求:某开发人员希望能在 Hi3861 , Hi3516 , Hi3518 开发板上都实现一个功能类似的应用程序,其中都会涉及到相同的文件操作。开发人员希望减少自己的代码开发量,通用的操作可以直接调用现成的库函数。

解决方案:在 HarmonyOS 操作系统内将常见的文件操作,数据库操作都实现并封装成库函数,用以开发者方便快捷的调用,避免“重复造轮子”。

image-20211231193856862

公共基础是什么?

公共基础库存放HarmonyOS通用的基础组件。这些基础组件可被HarmonyOS各业务子系统及上层应用所使用。

公共基础库在不同平台上提供对应的能力:

image-20211231194115702

常见文件操作接口介绍

image-20211231195429489

文件操作使用案例

常见的文件操作包括:创建或打开文件,写入文件,关闭文件,删除文件,获取文件大小,移动文件。

// 文件打开与文件写入特定大小的数据
char fileName[] = “testfile”;
static const char def[] = “utils_file_operation implement.”;
int fd = UtilsFileOpen(fileName, O_RDWR_FS | O_CREAT_FS | O_TRUNC_FS, 0);
int ret = UtilsFileWrite(fd, def, strlen(def));
printf(“file handle = %d\n write ret = %d\n”, fd , ret);
// 读取特定长度的文件数据
char buf[64] = {0};
int readLen = UtilsFileRead(fd, buf, 64);
printf(“read len = %d : buf = %s\n”, readLen, buf);// 使用ret = UtilsFileClose(fd)将文件关闭。
// 获取文件大小
ret = UtilsFileStat(fileName, &fileLen);
printf(“file size = %d\n”, fileLen);
// 文件删除
ret = UtilsFileDelete(fileName);
printf("delete ret = %d\n", ret);

远程升级使用场景

案例场景:现有一批开发板上的应用程序都需要升级刷新,传统方式需要开发人员将每一块开发板挨个重新烧录。

业务痛点:效率低下,需要开发人员在现场进行重复机械的工作。

解决思路:如果开发板能够连上网络,能否通过网络连接的方式远程控制一批开发板同时升级

image-20211231195745005

升级服务是什么?

OTA(Over the Air) 提供对设备远程升级的能力,可以让各种设备(如 IP 摄像头等),轻松支持远程升级能力。

目前 HarmonyOS 仅支持全量包升级,暂不支持差分包升级。
 全量包升级是将新系统全部内容做成升级包,进行升级。
 差分包升级是将新老系统的差异内容做成升级包,进行升级。

image-20211231195919952

启动恢复

启动恢复是什么?

启动恢复子系统负责从内核启动之后应用启动之前系统关键服务进程的启动过程以及设备恢复出厂设置的功能。

涉及以下组件: Init启动引导组件,Appspawn启动引导组件, Bootstrap服务启动组件,Syapara系统属性组件, Startup启动组件。

image-20211231201152908

Init启动引导组件

主要功能:Init启动引导组件负责在系统启动阶段启动关键服务进程,若用户需要新增随开机自启动的系统服务,可将新增服务加入配置文件init.cfg中。

运行机制:Init启动引导组件对应的进程为init进程,是内核完成初始化后启动的第一个用户态进程

init进程启动之后,读取init.cfg配置文件,根据解析结果,执行相应命令并依次启动各关键系统服务进程,在启动系统服务进程的同时设置其对应权限。

image-20211231211738021

Appspawn启动引导组件

  • 主要功能:负责接收用户程序框架的命令孵化应用进程设置新进程的权限,并调用应用程序框架的入口函数。
  • 运行机制:Appspawn被Init启动后,向IPC(Inter-Process Communication跨进程通信)框架注册服务名称,之后等待接收进程间消息,根据消息解析结果启动应用服务并赋予其对应权限。

image-20211231212606313

Bootstarp服务启动组件

主要功能:

提供各服务和功能的启动入口标识。在SAMGR(系统服务框架子系统)启动时,会调用boostrap标识的入口函数,并启动系统服务。

主要特点:

实现了服务的自动初始化,即服务的初始化函数无需显式调用,而是将其使用宏定义的方式申明,就会在系统启动时自动被执行

实现原理:

将服务启动的函数通过宏申明之后,放在预定义好的zInit代码段中,系统启动的时候调用OHOS_SystemInit接口遍历该代码段并调用其中的函数。

Syapara系统属性组件

主要功能:负责提供获取与设置操作系统相关的系统属性

OEM厂商部分仅提供默认值,具体值需OEM产品方按需进行调整。

image-20220101163723294


软总线

传统总线结构

传统的总线是一种内部结构,它连通着 CPU ,内存,输入输出设备,主机的各个部件共用这条通信通路。

image-20220101165651914

软总线结构

分布式软总线

  • 连通的是 1+8+N 的独立设备。 1 个手机8 种设备(车机,音箱,耳机,手表 / 手环,平板,大屏, pc ,AR/VR ), N 种 IoT 设备

  • 自发现

  • 自组网

  • 高带宽

  • 低延时

image-20220101170017850

传统连接方式与软总线连接方式对比

软总线的一项重要优势就是具备“自发现”能力

image-20220101171034594

image-20220101171050356

HarmonyOS设备开发工程师课程三(驱动基础)

本文源于HarmonyOS官方教程https://developer.huawei.com/consumer/cn/training/course/introduction/C101635908637340943

如有侵权,联系helloc2333@163.com删除。

驱动基础

设备驱动介绍

驱动程序全称设备驱动程序,是添加到操作系统中的特殊程序,其中包含有关硬件设备的信息。

驱动程序能使计算机与相应的设备进行通信。

image-20211222203410876

设备驱动分类:

根据设备读写操作的特征差异,设备驱动大致上可以分为三类:

  • 字符设备:即“字节设备”,软件操作设备时,以字节为单位进行。
  • 块设备: 设备的块大小是设备本身设计时定义好的,软件无法更改。
  • 网络设备:网络设备是专为网卡设计的驱动模型,主要用于支持 API 中 socket 相关函数的工作。

image-20211222203655390


HDF驱动框架

HDF (Hardware Driver Foundation) 硬件驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制管理旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。

image-20211222205051058

HDF驱动模型图解:

image-20211222205355935

驱动框架能力-驱动加载:

  • 按需加载:HDF 框架定义了驱动按需加载方式的策略,是由配置文件中的 preload 字段来控制, preload 字段的取值范围以及含义如下:

image-20211222210251876

  • 按序加载:配置文件中的 priority (取值范围为整数 0 到 200 )是用来表示 host 和驱动的优先级。驱动的加载顺序,优先根据 host 的 priority 决定其次是同一个 host 内驱动的priority 值。

驱动框架能力-驱动服务管理:

  • 驱动服务是HDF驱动设备对外提供能力的对象,由HDF框架统一管理。
  • 驱动服务管理主要包含驱动服务的发布获取
  • HDF框架定义了驱动对外发布服务的策略,是由配置文件中的policy字段来控制,policy字段的取值范围以及含义如下:

image-20211222210904758


驱动框架能力-驱动消息机制管理

  • 使用场景

    当用户态应用和内核态驱动需要交互时,可以使用HDF框架的消息机制来实现。

    • 消息机制的功能主要有以下两种:

      • 用户态应用发送消息到驱动
      • 用户态应用接受驱动主动上报事件

      image-20211222212241678

驱动开发

基于HDF框架进行驱动的开发主要分为两个主要部分:驱动实现和驱动配置

image-20211222212454884

驱动业务代码

#define HDF_LOG_TAG "sample_driver" // 打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签
// 驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架
int32_t HdfSampleDriverBind(struct HdfDeviceObject *deviceObject){
    HDF_LOGD("Sample driver bind success");
    return 0;
}
// 驱动自身业务初始的接口
int32_t HdfSampleDriverInit(struct HdfDeviceObject *deviceObject){
    HDF_LOGD(“Sample driver Init success”);
    return 0;
}
// 驱动资源释放的接口
void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject){
    HDF_LOGD("Sample driver release success");
    return;
}

驱动入口注册

// 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量
struct HdfDriverEntry g_sampleDriverEntry = {
    .moduleVersion = 1,
    .moduleName = "sample_driver",
    .Bind = HdfSampleDriverBind,
    .Init = HdfSampleDriverInit,
    .Release = HdfSampleDriverRelease,
};
// 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。
HDF_INIT(g_sampleDriverEntry);

驱动编译

驱动代码的编译必须要使用 HDF 框架提供的 Makefile 模板进行编译:

include $(LITEOSTOPDIR)/../../drivers/adapter/lite/khdf/lite.mk #导入hdf预定义内容,必需
MODULE_NAME := #生成的结果文件
LOCAL_INCLUDE := #本驱动的头文件目录
LOCAL_SRCS :=
#本驱动的源代码文件
LOCAL_CFLAGS := #自定义的编译选项
include $(HDF_DRIVER) #导入模板makefile完成编译

编译结果文件链接到内核镜像,示例如下:

LITEOS_BASELIB += -lxxx #链接生成的静态库
LIB_SUBDIRS +=
#驱动代码Makefile的目录

驱动设备描述

HDF 框架加载驱动所需要的信息,来源于 HDF 框架定义的驱动设备描述,因此基于 HDF 框架开发的驱动必须要在 HDF 框架定义的 device_info.hcs 配置文件中添加对应的设备描述,驱动的设备描述填写如下所示:

host节点是用来存放某一类驱动的容器

sample_host :: host{
    hostName = "host0"; // host名称,host节点是用来存放某一类驱动的容器
    priority = 100;
    // host启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证host的加载顺序
    device_sample :: device {
    // sample设备节点
    device0 :: deviceNode {
    // sample驱动的DeviceNode节点
    policy = 1;
    // policy字段是驱动服务发布的策略
    priority = 100;
    // 驱动启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证device的加载顺序
    preload = 0;
    // 驱动按需加载字段
    permission = 0664;
    // 驱动创建设备节点权限
    moduleName = "sample_driver"; // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致
    serviceName = "sample_service"; // 驱动对外发布服务的名称,必须唯一
    deviceMatchAttr = "sample_config"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等

配置管理

HCS (HDF Configuration Source) 是 HDF 驱动框架的配置描述源码,内容以 Key-Value (键值对)为主要形式。配置代码与驱动代码解耦,便于配置管理。

HC-GEN (HDF Configuration Generator) 是 HCS 配置转换工具。

image-20211222222702757

驱动平台介绍

HarmonyOS 提供统一的驱动平台,用于实现串口控制、数据通信、时间控制、 CPU 复位、模数转换、脉冲宽度调制等功能。

image-20211222232753651

驱动平台 GPIO 简介

GPIO (General-purpose input/output) 即通用型输入输出。通俗地说, GPIO 口就是一些引脚,可以通过它们输出高低电平或者读入引脚的高低电平状态。 GPIO 控制器通过分组的方式管理所有GPIO 管脚,每组 GPIO 有一个或多个寄存器与之关联,通过读写寄存器完成对 GPIO 管脚的操作。

GPIO 是芯片上一根能完成多种功能的管脚,用户可以通过 GPIO 口和硬件进行数据交互(如UART )控制硬件工作(如 LED ,蜂鸣器等),读取硬件的工作状态信号(如中断信号)等

image-20211231105719250

image-20211231110435210

UART简介

UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输。

image-20211231111533070

image-20211231111622933

UART的所有接口仅限内核态使用,不支持在用户态使用。

image-20211231112222312

I2C简介

I2C (Inter Integrated Circuit) 集成电路间总线是由 Philips 公司开发的一种简单、双向二线制同步串行总线

I2C 以主从方式工作,通常有一个主设备和一个或者多个从设备,主从设备通过 SDA (SerialData) 串行数据线以及 SCL (SerialClock) 串行时钟线两根线相连。

image-20211231181435840

I2C通信时序

I2C 时序主要有四个元素组成:起始信号,终止信号,应答 (0) ,非应答 (1) 。

image-20211231181716315

I2C数据传输

I2C 数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。数据传输以字节为单位,高位在前,逐个 bit 进行传输

image-20211231182810998

SPI简介

SPI 是串行外设接口 (Serial Peripheral Interface) 的缩写,是一种高速的,全双工,同步的通信总线

SPI 是由 Motorola 公司开发,用于在主设备和从设备之间进行通信,常用于与闪存、实时时钟、传感器以及模数转换器等进行通信。

一个主设备和两个从设备的连接示意图所示,从设备 A 和从设备 B 共享主设备的 SCLK 、 MISO 和 MOSI 三根引脚,从设备 A 的片选 CS0 连接主设备的 CS0 ,从设备 B 的片选 CS1 连接主设备的 CS1 。

image-20211231183142051

SDIO简介

SDIO 是安全数字输入输出接口 (Secure Digital Input and Output) 的缩写,是从 SD 内存卡接口的基础上演化出来的一种外设接口。 SDIO 接口兼容以前的 SD 内存卡,并且可以连接支持 SDIO 接口的设备。

SDIO 常用于移动端设备例如手机的外设开发,使得设备外接外设更加容易,常见的 SDIO 外设有 WLAN 设备、 GPS 、 CAMERA 、蓝牙。

image-20211231183254741

RTC简介

RTC(real-time clock) 为操作系统中的实时时钟设备,为操作系统提供精准的实时时间和定时报警功能。当设备下电后,通过外置电池供电, RTC 继续记录操作系统时间;设备上电后, RTC 提供实时时钟给操作系统,确保断电后系统时间的连续性。

以 STM32F103 芯片为例,其内部有独立供电的实时时钟和单独的振荡电路,无需外接时钟芯片。

WATCHDOG

看门狗 (watchdog) ,又叫看门狗计时器 (watchdog timer) ,是一种硬件的计时设备,当系统的主程序发生某些错误时,导致未及时清除看门狗计时器的计时值,这时看门狗计时器就会对系统发出复位信号,使系统从悬停状态恢复到正常运作状态。

看门狗可以看成是一种特殊的定时器,只不过定时时间到了之后不只是产生中断,还可以复位 CPU

image-20211231183519086

ADC

ADC (Analog to Digital Converter) 模数转换器。现实生活中的所有属性(如温度、湿度、光照强度等)都是连续的,即为模拟信号;而单片机或电子计算机所能识别的信号都是离散的数字信号。此时,若是需要使用现实世界中的各种属性,就需要一种设备将模拟信号转换为数字信号,它就是模数转换器。

模数转换一般要经过采样、量化和编码这几个步骤。

PWM

PWM (Pulse Width Modulation) 又叫脉冲宽度调制,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化。占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是 50% 。

image-20211231183819144

FPGA项目记录

一、Version 1: 在AD7606.v文件中采用复用8个通道数据变量的方法连续读取AD_1和AD_2

串口所使用的分频时钟clk约为 系统时钟clk50的325倍。

从状态IDLE到AD转换结束,可以开始读取数据,需要大于27个clk50;

从状态READ_CH1到READ_CH8结束,需要32个clk50;

等待ad_select从00切换到01需要20个clk50;

即:

  • 连续读取AD_1或AD_2的8个通道的数据需要32个clk50;
  • 如果单独读取一轮转换后的AD通道的数据需要大于:27+32=59个clk50;
  • 读取一轮转换后的AD_1和AD_2的8通道的数据需要大于:27+32+20+32=111个clk50;
阅读更多...
  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信