树莓派linux led字符设备驱动(传统)

  Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。所以 LED 灯驱动最终也是对树莓派的 IO 口进行配置,但是在 Linux 下编写驱动要符合 Linux的驱动框架。一、树莓派GPIO
分类: 其他 发布时间: 10-08 22:37 阅读次数: 0

树莓派linux led字符设备驱动(新字符设备)

字符设备驱动开发时使用 register_chrdev 函数注册字符设备,使用unregister_chrdev 函数注销字符设备,驱动模块加载成功以后还需要手动使用 mknod 命令创建设备节点。
分类: 其他 发布时间: 10-08 22:37 阅读次数: 0

树莓派linux led字符设备驱动(设备树)

在嵌入式 Linux驱动开发 中, ARM 相关的驱动全部采用了设备树。所以大量的驱动程序使用设备树开发。
分类: 其他 发布时间: 10-08 22:36 阅读次数: 0

树莓派linux led字符设备驱动(pinctrl 和 gpio 子系统)

一、pinctrl 子系统Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于 GPIO的配置推出了 gpio 子系统。pinctrl 子系统就是为了解决配置寄存器比较繁琐且易出错而引入的。要使用 pinctrl 子系统,我们需要在设备树里面设置 PIN 的配置信息。1.1、设备树中添加 pinctrl 节点模板...
分类: 其他 发布时间: 10-08 22:36 阅读次数: 0

树莓派linux led字符设备驱动(原子操作)

一、原子操作  linux驱动中为了处理对共享资源的并发访问,引入了原子操作。原子操作就是指不能再进一步分割的操作,一般原子操作用于变量或者位操作。 Linux 内核提供了两组原子操作 API 函数,一组是对整形变量进行操作的,一组是对位进行操作的。1.1、原子整形操作 API 函数  Linux 内核定义了叫做 atomic_t 的结构体来完成整形数据的原子操作,在使用中用原子变量来代替整形变量,此结构体定义在 include/linux/types.h 文件中。常用的API有:  ATOMIC_
分类: 其他 发布时间: 10-08 22:36 阅读次数: 0

树莓派linux led字符设备驱动(自旋锁)

一、自旋锁  当一个线程要访问某个共享资源的时候首先要先获取相应的锁, 锁只能被一个线程持有,只要此线程不释放持有的锁,那么其他的线程就不能获取此锁。对于自旋锁而言,如果自旋锁正在被线程 A 持有,线程 B 想要获取自旋锁,那么线程 B 就会处于忙循环-旋转-等待状态,线程 B 不会进入休眠状态或者说去做其他的处理。  自旋锁的“自旋”也就是“原地打转”的意思,“原地打转”的目的是为了等待自旋锁可以用,可以访问共享资源。把自旋锁比作一个变量 a,变量 a=1 的时候表示共享资源可用,当 a=0的时候表示
分类: 其他 发布时间: 10-08 22:36 阅读次数: 0

树莓派linux led字符设备驱动(信号量)

一、信号量  Linux 内核提供了信号量机制,信号量常常用于控制对共享资源的访问。相比于自旋锁,信号量可以使线程进入休眠状态,使用信号量会提高处理器的使用效率。但是,信号量的开销要比自旋锁大,因为信号量使线程进入休眠状态以后会切换线程,切换线程就会有开销。总结一下信号量的特点:  ①、因为信号量可以使等待资源线程进入休眠状态,因此适用于那些占用资源比较久的场合。  ②、因此信号量不能用于中断中,因为信号量会引起休眠,中断不能休眠。  ③、如果共享资源的持有时间比较短,那就不适合使用信号量了,因为频
分类: 其他 发布时间: 10-08 22:35 阅读次数: 0

树莓派linux led字符设备驱动(互斥)

一、互斥体  互斥访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。Linux 内核使用 mutex 结构体表示互斥体。使用 mutex 之前要先定义一个 mutex 变量。在使用 mutex 的时候要注意如下几点:  ①、 mutex 可以导致休眠,因此不能在中断中使用 mutex,中断中只能使用自旋锁。  ②、和信号量一样, mutex 保护的临界区可以调用引起阻塞的 API 函数。  ③、因为一次只有一个线程可以持有 mutex,因此,必须由 mutex 的持有者释放 mutex。
分类: 其他 发布时间: 10-08 22:35 阅读次数: 0

树莓派linux led字符设备驱动( platform)

Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生了platform 设备驱动,也叫做平台设备驱动。platform引入了总线(bus)、驱动(driver)和设备(device)模型。1.1、platform 总线Linux系统内核使用bus_type结构体表示总线,此结构体定义在文件include/linux/device.h中。platform 总线是 bus_type 的一个具体实例,定义在文件 drivers/base/platform.c中s
分类: 其他 发布时间: 10-08 22:35 阅读次数: 0

树莓派linux led字符设备驱动( linux自带)

  树莓派的Linux 内核已经集成了LED 灯驱动。 Linux 内核的 LED 灯驱动采用 platform 框架。编译树莓派linux内核时,会输入配置命令构建配置linux内核,如:cd linuxKERNEL=kernel7lmake bcm2711_defconfig  linux内核的makefile会从arch/arm/configs 目录中寻找默认配置文件: bcm2711_defconfig,配置完成后会生成.config 文件。打开.config 文件,有“CONFIG_L
分类: 其他 发布时间: 10-08 22:35 阅读次数: 0

将驱动程序编译进linux内核

  在linux驱动开发时,一般的做法是将驱动程序编译成.ko文件,然后使用“modprobe”命令将驱动模块加载到内核中。但在驱动开发完成后,就需要将驱动程序编译进Linux内核里面。一、直接将驱动写死进linux内核  1、以led字符设备驱动为例,首先在linux内核源码的/drivers/char/文件夹下创建一个mytest_led文件夹,将驱动文件存放在此文件夹下。  2、修改/drivers/char/文件夹下的Makefile文件,添加一句:obj-y += mytest_le
分类: 其他 发布时间: 10-08 22:34 阅读次数: 0

以动态库的形式编写linux驱动

  在具体的工程实践中,可能因为种种的原因无法重新编译linux内核,此时嵌入式工程师可以通过linux的API编写驱动代码,并将驱动以动态库的形式呈现给上层开发人员。本文提供一个工程实例的框架,来实现linux动态库的编译和装载。一、创建工程文件夹目录  首先创建lib文件夹存放整个工程的文件,然后在lib文件夹下创建project文件夹存放工程的源文件,再创建obj文件夹存放工程的编译文件。二、创建编译文件  1、首先在lib文件夹下创建如下三个文件:  ①、build文件,控制编译和装载的s
分类: 其他 发布时间: 10-08 22:34 阅读次数: 0

Shell 文件

  Shell 文件是以某种方式将一些命令放在一起得到的文件,常称为 Shell 脚本。 Shell 文件通常以“#!/bin/sh”开始, #!后面指定解释器,如下是一个简单的 Shell 文件的内容:#!/bin/shecho "hello world!"  文件名为 aa.sh,增加可执行权限后,在 Shell 中即可运行,将在终端打印hello world!”字符串。$chmod +x aa.sh$./aa.shhello world!  执行 Shell 脚本有多种方式:  (
分类: 其他 发布时间: 10-08 22:34 阅读次数: 0

Shell 编程(基础)

  Shell 程序一般被称为脚本(Script),它其实就是一组命令的集合。若需更复杂的逻辑与功能,就要引入一些新的概念如:变量、表达式、流程控制和函数等。  Shell 从任意地方非转义的“#” 字符开始到行末被认为是注释。可执行文件在被读取的时候,内核通过“#!”组合开头识别出这是一个需要运行解释器脚本,并且根据约定将其后的字符串在读到换行以前解释为该脚本需要的解释器所在路径。系统会按照路径调用解释器之后再把整个文本的内容传递给解释器。  Shell 脚本,一般以“#!/bin/sh”或“#!/b
分类: 其他 发布时间: 10-08 22:34 阅读次数: 0

嵌入式系统数字滤波算法的特点

  很多嵌入式系统都需要通过A/D转换方式采集模拟信号,为了获取尽可能真的结果需要进行滤波。  数字滤波的不足之处就是要消耗一定的CPU资源,在进行实时的信号处理时要注意这一点。当信号为高频信号,干扰信号为低频信号时,需要采用高通滤波器。而实时高通滤波算法受CPU速度的限制,往往力不从心,而硬件高通滤波器确很容易处理这种实时信号。当有用信号为低频信号,干扰信号为高频信号时,需要采用低通滤波器。由于低通滤波器往往体积较大,且对CPU资源的消耗较少,所以,数字滤波主要应用领域为实时低通滤波。...
分类: 其他 发布时间: 10-08 22:33 阅读次数: 0

数字滤波算法——程序判断滤波

在实际生产中,相邻两次采样值之间的变化都有一个合理的限度。如果相邻两次采样值之间的变化为超过预定的范围,说明该采样值未收到明显干扰,可以采信。如果相邻两次采样值之间的变化超过预定范围,说明采样值收到明显干扰,不能采信。对于不可信得采样数据,必须输出一个合理的替代数据,以保证采样序列的连续性和完整性。在要求不高的场合,可以用前一个采样数据来替代。这种由程序进行简单判断的数字滤波算法称为“程序判断滤波”,也称“限幅滤波”。相应程序如下:#define D 10 //相邻两次采样之间最大允许变化值
分类: 其他 发布时间: 10-08 22:33 阅读次数: 0

数字滤波算法——中值滤波

程序判断滤波有一个潜在的隐患
分类: 其他 发布时间: 10-08 22:33 阅读次数: 0

Error[e16]: Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition.

在使用IAR编译CC2541的 BLE工程时,官方的工程直接编译会出现错误:解的方法为:右键工程选择“options”,如图选择:将“Number of virtual”,中默认的16改为8,再重新编译即可以解决。
分类: 其他 发布时间: 10-08 22:33 阅读次数: 0

2021-06-24 Linux系统自有服务

Linux系统自有服务一、Linux中防火墙firewalld1、什么是防火墙防火墙:防范一些网络攻击。有软件防火墙、硬件防火墙之分。防火墙选择让正常请求通过,从而保证网络安全性。Windows防火墙:Windows防火墙的划分与开启、关闭操作:2、防火墙的作用3、Linux中的防火墙分类CentOS5、CentOS6 => 防火墙 => iptables防火墙CentOS7 => 防火墙 => firewalld防火墙firewalld = fire
分类: 其他 发布时间: 10-08 22:32 阅读次数: 0

6-25 Linux计划任务以及进程检测与控制

Linux计划任务以及进程检测与控制一、Linux计划任务1、计划任务权限☆ 黑名单crontab是任何用户都可以创建的计划任务,但是超级管理员可以通过配置来设置某些用户不允许设置计划任务 。提出问题:如果我们想限定某个用户(如itheima)使用计划任务,如何处理呢?答:可以使用计划任务的黑名单,黑名单文件路径 => /etc/cron.deny文件案例:把普通账号itheima加入到cron.deny黑名单中,禁止其创建计划任务第一步:切换到超级管理员root# su - roo
分类: 其他 发布时间: 10-08 22:32 阅读次数: 0