暂时未有相关云产品技术能力~
专注于嵌入式Linux领域
Linux系统关于时区的配置有两种方式: 通过配置/etc/localtime和/etc/timezone文件。 通过配置TZ环境变量。
众所周知,Android作为目前主流的移动终端领域的开发平台,其主要的开发语言就是JAVA。Android借助于JAVA高效、灵活的开发模式,迅速占领了移动互联网开发的半壁江山。基于JDK和Android实现的各种JAVA框架,开发人员可以快速实现各种功能的APP,而且APP的安装和升级维护都实现的方便。
上篇文章简要分析了如何编写一个Linux下的I2C设备驱动程序。编写驱动程序毕竟有一定的门槛,需要熟悉内核各种相关的开发规范,有时为了快速的测试一款I2C设备的功能,临时编写驱动程序可能会使得工期比较紧张;并且有时I2C设备十分的简单,为此编写一个单独的驱动程序未免有点“兴师动众”。
I2C总线是由飞利浦在80年代初设计的,以允许位于同一电路板上的组件之间能够轻松通信。其大大简化了电路的设计,早期的电视机中很多地方用到了I2C这种通信方式。飞利浦半导体于2006年迁移到了NXP。I2C名称翻译为“ Inter IC”。有时,该总线称为IIC或I²C总线。I2C总结的基本的特征
Linux系统时间分为两种:系统时间和硬件时间。系统时间为Linux内核时间,硬件时间一般为BOIS中的RTC时间。Linux内核在启动时,会尝试读取BIOS中的RTC时间,并以此为基准设置系统时间。内核启动之后,系统时间和硬件即为两个独立的时间,各自运行。
上篇文章讲解了如何正确的使用内核延时函数,在进行驱动开发时,可能会经常用到精确地延时操作。除此之外,如果要实现一个定时任务,那就需要用到定时器。作为一项基础功能需求,Linux内核提供了定时器相关的实现。下面就具体看一下,Linux内核所提供的定时器实现。
进行嵌入式Linux驱动开发时,不可避免的会涉及到DTS相关的编写工作,而其中,最为重要的一项工作就是pinctrl相关的配置,这包括pins的功能选择(作为普通IO,还是作为外围控制器的pins)以及pins的配置(pull-up/pull-down、驱动能力、三态等)。 内核中的pinctrl子系统抽象了不同SoC中关于pins的管理方式,Linux内核之pinctrl子系统对于pinctrl子系统进行了简要的概述,如果想要了解pinctrl子系统,可以参考这篇博文。
为了能够更好的学习嵌入式Linux内核,本文基于qemu-system-arm工具模拟ARM公司的VersatileExpress硬件环境,基于buildroot工具制作rootfs,并且扩展了buildroot,增加内核配置管理,定制rootfs等功能。
嵌入式系统开发经常会遇到采集模拟量的功能需求,这时就会用到ADC,STM32系列MCU提供了强大的ADC功能,其提供的多通道采集和DMA方式极大的方便了ADC相关的开发流程,本文主要记录一下,如何使用ADC实现基于DMA的多通道模拟量采集功能。
Linux内存工具解析之RSS/VSS/USS/PSS区别于联系
Android系统固件定制方式
信号是类UNIX系统中存在一种异步通信机制,用于内核通知用户进程系统里发生了某个事件,例如,编写过应用程序的朋友应该都会遇到过”段错误“,引起段错误的信号就是SIGSEGV,此外,当用户键入Ctrl+C之后,就可以停止前台的终端进程,或者在终端通过kill命令就可以杀死某个进程。
Linux设备树系列-GPIO驱动实践
Unix 设置用户ID和文件访问权限
Android系统调试-程序崩溃调试
C/C++ enum使用
gcc-stack-protector机制
GNU/Linux C 库I/O缓冲机制
Glibc version `GLIBC_2.17' not found问题解决办法
本文主要介绍如何为新机器编写设备树,它旨在描述设备树的基本概念以及它们如何将其应用于描述机器。有关设备树数据格式的完整技术说明,请参阅 ePAPR v1.1规范。ePAPR规范比本文介绍的有关设备树的描述包含更多详细的信息,请参阅此文以获取本文未涵盖的关于设备树的更高级用法 。
文件.dts是一种ASCII文本格式的设备树描述,由于其是纯文本形式的,所以十分适合开发人员阅读和修改。由于多个开发板会对应于同一款SoC,所以,可以将关于同一款SoC的DT配置提取成一个单独文件,称其为.dtsi文件。.dts和.dtsi文件类似于C语言的源文件和头文件的关系,所以.dtsi同样可以包含其他的.dtsi文件。
对于需要Android系统下,进行Linux驱动、ramdisk定制的开发人员来说,boot.img必须掌握,下面介绍一下boot.img文件格式。
众所周知,ARM SoC提供了十分丰富的硬件接口,而接口物理上的表现就是一个个的pin(或者叫做pad, finger等)。为了实现丰富的硬件功能,SoC的pin需要实现复用功能,即单独的pin需要提供不同功能,例如,pin0既可以作为GPIO,可以也用于i2c的SCL,通过pin相关的复用寄存器来切换不同的功能。除此之外,软件还可以通过寄存器配置pin相关的电气特性,例如,上拉/下拉、驱动能力、开漏等。
本文当记录使用buildroot制作rockchip-rk3288平台的rootfs过程。
操作系统提供的同步原语包括:互斥锁、读写锁、条件变量、信号量,支持多任务的OS一般都会实现上述几种同步方式。Linux作为多任务、多用户系统,同样实现了上述几种同步方式。对于在Linux系统下编程的程序员来说,可能都或多或少的使用或者听说过这几种方式,对于它们的基本使用方式可能都大体的解了。
Linux系统提供了很多关于time的处理API,这些API各自的功能和使用场景都有所不同。对于初学者有时会混淆它们,对于API的具体含义理解不到位。本文总结各类time相关的API的使用方式。 分类的标准按照函数的具体功能进行划分。
最近在总结关于Linux系统关于Time处理相关的API,当在开发库中使用到localtime_r以及clock_gettime时,会提示如下的错误(-Werror选项打开):
上篇博文4_TensorRT概况主要讲了Nvida TensorRT的编程API,本篇主要通过一个简单、完整的例子来讲解如何将一个Caffe模型(GoogleNet模型)通过TensorRT进行推理加速。
epoll作为一种基于事件通知的I/O处理模型,广泛用于需要I/O多路处理的场景。epoll API所执行的任务与poll类似:监测多路文件描述符的I/O可用性。
Open Neural Network Exchange (ONNX)为AI模型提供了一种开源的数据模型格式。它定义了一个可扩展的计算图模型,以及内置运算符和标准数据类型的定义。它可以作为各种AI模型之间进行转换的媒介,例如,市面上没有现成的Caffe模型到MxNet模型的转换工具,我们可以借助于ONNX,首先将Caffe转换为Onnx,然后再将Onnx转换为MxNet,更为神奇的是,这之间的转换过程不过丢失原有模型的精度。
STM32开发平台,时至今日发展的已经相当成熟了,尤其对于外围硬件接口的抽象封装库,即HAL。好多基于STM32开发的工程师,习惯于直接操作外围接口相关的寄存器来完成所谓的驱动开发,其实,ST公司早就为大家准备好了对于这些外围接口的驱动框架,我们只需要直接拿来就可以使用。
我们在使用类UNIX系统时,经常会涉及到各种ID,比如,文件属性相关的用户ID、组ID,进程运行时相关的6个ID:实际ID、实际组ID、有效ID、有效组ID、保存的用户设置ID、保存的设置组ID。
内核模块-基本概念
上一篇文章讲了如何实现基于内核模块的“helloworld”,相信大家通过这个例子对于内核模块有了一个基本的了解。当然,内核模块绝不仅仅只能实现这点功能,其最大的应用就是实现硬件的驱动程序。其实,linux内核中很大一部代码都是硬件处理相关的,比如,设备-总线-驱动框架,USB框架、spi框架、i2c框架等等,对应于各种不同的硬件设备,相应的就会有设备驱动程序,从最简单的按键、LED驱动,到十分复杂的USB子系统驱动,可以好不夸张的说,Linux内核可以适配绝大多数的硬件设备。
从事Linux内核开发特别是驱动开发的小伙伴,肯定需要经常使用到定时器,比如,按键的去抖、LED屏幕显存buffer的刷新等。同时,在控制硬件时,可能会用到十分精确地短延时,这时,定时器的精度就不能满足这种需求了,这时就会使用到高精度定时器和忙等延时。今天就来简要说一下如何正确的使用内核提供的delay和sleep函数。
在进行嵌入式Linux应用程序开发时,经常会用到gdb对崩溃日志进行分析,一般情况下,可以直接定位到崩溃的位置。但有时分析core文件时,却看不到有意义的崩溃栈,这时问题就有点复杂了,出现这种现象的原因可能有这么几个
本文主要介绍如何修改WSL账号密码,本文针对的WSL版本为Ubuntu18.04。
最近,在使用树莓派时,由于异常掉电,导致树莓派的文件系统遭到破坏,系统启动时提示下面的信息:
最近,在调试基于Freescale IMX6UL板子的以太网口时,遇到了一个奇怪的问题:网口插拔时,系统检测不到Link Down、Link UP事件。并且,在使用ifconfig eth0 up,然后再ifconfig eth0 down时,会提示
熟悉Linux内核的开发人员都知道,Linux下的进程地址空间分为内核空间和用户空间,对于32bit系统来说,典型的空间划分为:1G(内核空间)+3G(用户空间)
Linux作为一款强大的操作系统,凭借其优异的的网络服务功能,被广泛使用到云服务中心、数据中心、嵌入式边缘物联代理等需要可靠的网络服务支持的场景中。具体到生成环境,免不了使用工具去管理和控制网络,本文就来带领大家细数一下,Linux下都有哪些提供网络管理的工具。
一个好的帮助信息对于快速、高效的使用shell脚本是非常有好处的。我们一般通过echo来逐行打印帮助信息,这种方式一个明显的缺点就是需要手动去进行排版,而排版的过程有时十分的繁琐。有没有想过,如果可以像写一般的注释一样来完成帮助信息的编写,那该多好啊!本文通过sed这个工具来实现,像写注释一样写shell的帮助信息。
链表作为一种基本的数据结构,得益于其简单的结构、优良的性能(双向链表的插入和删除复杂度都是O(1)),被广泛的应用于各种程序设计中。链表一般分为单向链表和双向链表。对于单向链表,其删除和插入的一般复杂度都是O(n),所以,工程上一般很少使用,下面介绍的所有链表都是双向链表。
不同于单片机驱动开发,即使是简单的I2C设备驱动程序,如果要在Linux上实现同种功能的驱动程序,事情也会变的复杂起来。对于初学者而言,主要的困难就是不知道如何使用Linux现有的驱动框架,去完成驱动程序的开发。I2C设备驱动,相对来说比较简单,但由于Linux大部分设备驱动框架十分的类似,所以,通过对于I2C驱动框架的学习,可以作为继续深入Linux其他设备驱动框架的基础。
平时在学习大牛的Shell脚本时,我们经常在脚本的开头看到很多set开头的命令
Linux shell脚本IO重定向
[计算机系统]之虚拟内存-第一部分(基本原理续)
根据冯•诺依曼计算机体系结构的定义,CPU和内存是最为核心的系统构件,CPU用于程序指令的执行,而内存作为磁盘数据的缓存,用于为CPU提供指令和数据保存的环境。
上一篇文章主要是总结了C语言下格式化输出相关的内容,这一节来总结一些格式化输入相关的内容。
说起C语言I/O操作,学过C的人第一反应想到的肯定是printf/scanf之类的函数,那可是C语言的基础,程序调试的必备技能 :)。不错,作为一名C程序猿,printf确实是使用最为高频的函数了。但是如果我要问,如何格式化输入/输出我们想要的内容,大家可能就有点心虚了。为了修补上这个bug,今天我就和大家一起学习一下C的格式化I/O。