自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (1)
  • 收藏
  • 关注

原创 windows 任务计划程序 搜索任务位置的方法

有些任务执行了,占用cpu,内存,硬盘过高,不想执行该任务,可以将该任务禁用,这时 如果找不到该任务,可以进行任务的搜索,下面写出搜索任务的办法。该程序的作用是根据触发条件(时间,时间间隔,开机操作,联网操作等),执行一些计划中的任务。windows 任务计划程序。1.使用管理员权限打开cmd。

2024-09-24 11:58:44 188

原创 需求分析步骤

所以,需求验证不可能发现所有的需求问题,在需求验证之后,对遗漏的补充以及对错误理解的更正是不可避免的,因此需要进行需求管理。5.2由于需求的变化往往使系统的设计和实现也跟着改变,所以由需求问题引起的系统变更比修改设计或代码错误的成本高得多。2.4用户提出的超出实现范围能力的需求和不同用户提出的相互冲突的需求,需要一个谈判过程来调解冲突。2.2分析每个需求与其他需求的关系,以检查需求的一致性、重叠和遗漏的情况。5.1检验需求功能的正确性、完整性、清晰性,是否能够反映用户的意愿。

2024-06-05 09:52:59 585

原创 规划的实操步骤

1.首先我们要先知道我们要调谁的研,这个自然是客户的,对客户的定位是我们调研的方向,我们的客户已经是很明确,对我们以前的客户,现有的客户,未来的客户,进行调研。3.调研内容,贴合产品应用方向,用户的日常活动,人文生活,如,日常训练,物资盘点,人事调动,生活便利,营养健康,医务健康,思想健康,政策宣传等。2.如何调研,我们使用哪种形式,采用哪些方法,调研哪些问题,进行对用户的深度探索,以保证能将问题深度的挖掘出来,从而保证调研的价值。调研,如何调研,调谁的研,根据调研结果进行问题的筛选分类。

2024-05-27 10:34:02 164

原创 QT打包命令的使用

linuxdeployqt 程序文件 -qmldir=qml源码路径 -appimage。

2024-05-27 10:30:22 200

原创 关系数据库的规范化,关系模式,充分理解三级范式

当一个集合R中,每一个元素都不可再分的时候,便符合第一范式。例:{学号,姓名,专业编号,专业名称,课程号,课程名,成绩}

2024-05-13 15:34:54 150

原创 软件设计各个阶段的成果

自行整理的软件设计阶段性成果,如有不对的地方,欢迎指正。

2024-05-12 23:47:36 486

原创 open麒麟系统安装sql的经验和步骤

麒麟、QT、mysql-5.7.37,编译mysql驱动。

2023-10-13 17:32:51 660

转载 Linux:串口编程详解(转)

串口本身,标准和硬件 †串口是计算机上的串行通讯的物理接口。计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备。虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代;而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之。但是,一方面因为串口本身造价便宜技术成熟,另一方面因为

2020-07-03 10:05:36 1086

原创 linux:tcgetattr 函数功能和使用场景

#include <termios.h>该函数用到 struct termios 该数据结构/*定义一个termios结构体*/struct termios options;/*将文件描述符的属性放入该结构体*/tcgetattr(fd,&options);/*修改相应的属性*/cfsetispeed(&options,B4800);cfsetospeed(&options,B4800);options.c_cflag |= CLOCAL;//保证程序

2020-07-02 22:32:13 4513

原创 linux:串口通信初始化设置示例代码

static int uart_set(int baude,int c_flow,int bits,char parity,int stop){ struct termios options; /*获取终端属性*/ if(tcgetattr(fd,&options) < 0) { perror("tcgetattr error"); return -1; } /*设置输入输出波特率,两者保持一致*/ sw

2020-07-02 15:02:06 2066

原创 linux:assert宏的意义

assert(x);判断 x是不是 0 如果是 0 程序 abort中断退出

2020-07-02 13:55:11 154

原创 ARM:IIC总线使用(day04 mma8653芯片驱动编程)

S5P6818内部集成了3个独立的I2C控制器问题:mma8653芯片挂在了哪个I2C控制器上?答:根据mma8653芯片连接的cpu管脚来推断 对应了CPU内部的I2C 2控制器关于I2C总线 (谈谈对I2C的理解)1 I2C总线定义 飞利浦开放的两线式串行同步总线 SCL: CLOCK 时钟线 SDA: DATA 数据线 2 I2C总线的特点 1)通信时只需要两条线 硬件互联成本低 2)I2C总线上可以存在多个主设备 多个从设备 3)总线上

2020-06-27 19:30:25 963

原创 ARM:UART总线使用(day03 uart驱动编程)

UART, 串行异步收发器是接在GPIO管脚上,此管脚可以配置为GPIO功能,也可配置为uart功能S5P6818内部集成了6个独立的UART控制器问题:开发板上COM1座对应了CPU内部哪个UART控制器? 线索是COM1 收发数据线连接到了CPU的哪个管脚上 根据连接的CPU管脚去推断COM1对应了CPU内部的UART0控制器 1串行接口的标准RS232 电气特性 EIA电平/RS232电平 逻辑0: 3~15v

2020-06-27 16:52:22 416

原创 ARM:GPIO总线管脚使用(day02 LED驱动编程)

GPIO总线是cpu通过特殊功能寄存器直接 读取/修改 高低电平信号的管脚 GPIOCALTFN0:配置管脚功能 GPIOCOUTENB:输出模式 GPIOCOUT: 控制输出高电平还是低电平 volatile volatile作用:防止编译器的过度优化 每次取变量值时都去实际地址中读取 而不是使用缓存中的缓存值 v

2020-06-26 20:53:32 512

原创 理解http协议

http协议 是网络传输成功后沟通的办法相当于拿到了网络传输的信息,如何说才能让对方明白http协议沟通的方式是 一问一答客户端问 服务器答问的协议格式是:答的协议格式是:

2020-06-24 11:36:33 238

原创 谈谈对IIC的理解

定义: I2C 飞利浦公司开发的 两线式串行同步总线 SCL SDA特点:通信协议: 三个辅助信号 START,SCL高 SDA下降沿 STOP, SCL高 SDA上升沿 ...

2020-06-23 10:10:26 647

原创 驱动:11.4 内核中自带的按键驱动程序分析

1 platform_driver 的实现drivers/input/keyboard/nxp_io_key.c nxp_key_probe(){ input = input_allocate_device(); input->name = "Nexell Keypad"; input->evbit[0] = BIT_MASK(EV_KEY) input->evbit[0] |= BIT_MASK(EV_REP);

2020-06-23 09:42:08 298

原创 驱动:11.2 总线驱动模型

为了统一芯片设备驱动框架内核中设计了一套1.总线struct bus_type{ const char *name;}bus_registervoid bus_unregister(struct bus_type *bus);ls /sys/bus/2.设备struct device{ struct bus_type *bus; //该设备挂在那条总线上 ...}int device_register(struct device *dev);void device_unre

2020-06-22 11:54:35 127

原创 驱动:11.3 platform总线

1.总线driver/base/platform.cbus_register(platform_bus_type);2.设备struct platform_device{ //platform_device.h 派生类 const char *name; struct device dev; // 基类 u32 num_resoutces; //资源个数 struct resource *resoutce; //资源信息的地址 ...}int platform_dev

2020-06-22 11:53:32 174

原创 驱动:11.1 找出内核中自带的按键驱动程序

移植课:配置是如何影响编译过程的驱动课:将内核中自带按键驱动程序裁剪掉help中有下图中的信息变量:CONFIG_KEYBOARD_NXP_KEYDefined at drivers/input/keyboard/Kconfig:583此文件中对应了该变量相应的.o文件便可找到对应的.c文件按键驱动: drivers/input/keyboard/nxp_io_key.c为什么看起来我们写的驱动程序和内核写的驱动程序区别很大呢?请看下一节...

2020-06-22 10:02:42 168

原创 驱动:10.2 input子系统

1)按键键值标准化的问题 2)按键键值缓冲区的问题 它本质上应该是一个循环缓冲队列 用户进程对该缓冲区执行读操作 中断处理过程要对该缓冲区执行写操作 它属于共享资源,如何解决竞态? 建议尝试编程 3) 按键按住不放 按下保存了键值后 开启一个新的定时器 该定时器隔一段时间就向按键缓冲区存储一个键值 ... 当释放按键动作产生时停止该定时器 建议尝试1.什么是input子系统它是内核中的一部分代码Linux中随着支持的硬件设.

2020-06-20 23:42:37 211

原创 驱动:9.3 mmap

内存管理:是将物理内存映射到3-4G内核空间使得可以在内核空间操作物理内存ioremap:是将IO设备映射到3-4G内核空间使得可以在你和空间操作特殊功能寄存器mmap:是将物理内存/特殊功能寄存器映射到0-3G的用户空间使得在用户空间可以直接控制硬件int mmap(struct file *file, struct vm_area_struct *vma)void *mmap(void *addr, size_t length, int prot, int flags, int fd, o

2020-06-19 17:39:52 162

原创 驱动:9.2 ioremap

将特殊功能寄存器物理地址进行映射通过映射之后的虚拟地址访问特殊功能寄存器统一编址:将内存和外设(特殊功能寄存器) 使用同一套地址编号去编址,称作统一编址 ARM处理器 访问内存 ldr/str 访问外设 ldr/str独立编址:将内存和外设(特殊功能寄存器) 各自使用一套独立的编号去编址,称作独立编址 X86处理器 访问内存 mov 访问外设 in / outlinux内核中将使用统一编址的外设称为I/O内存 独立

2020-06-19 14:56:44 187

原创 驱动:9.1 内存管理

人家如何管理的我们怎么使用呢1、需要掌握的基本概念1)内核管理内存是以物理内存页为基本单位,通常一个物理内存页为4KB内核会为每个物理内存页创建一个struct page类型的对象struct page{ atomic_t _count;//记录该物理内存页被引用的次数 为0 代表空闲页}2)内核管理内存时对所有的内存并不是一视同仁 低端内存:<896M(可调)的内存,采用静态的映射方式 虚拟地址 -0xc0000000+物理偏移 例如物理地址为0x40000

2020-06-19 14:08:51 144

原创 驱动:8.3设备的非阻塞方式访问

应用程序:fd = open("/dev/mybuttons",O_RDONLY); //阻塞方式fd = open("/dev/mybuttons",O_RDNLY|O_NONBLOCK);//非阻塞方式驱动程序:也需要支持非阻塞方式代码示例:#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/cdev.h>#incl

2020-06-17 17:34:20 140

原创 驱动:8.2按键去抖

使用定时器或底半部延时工作队列按下去抖的-代码示例:#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/device.h>#include <linux/interrupt.h>#include <linux/uaccess.h>#include

2020-06-17 16:41:37 165

原创 驱动:8.1设备的阻塞方式访问

用户空间:recv/acceptfd = open("/dev/mybuttons",…);read(fd,buf,len);//有数据读,无数据等待驱动程序:要是实现设备的阻塞方式操作,要使用内核中的等待队列机制等待队列的核心数据结构:struct __wait_queue_head { spinlock_t lock; struct list_head task_list;};typedef struct __wait_queue_head wait_queue_head_t;

2020-06-17 15:08:58 197

原创 驱动:7.1内核中的竞态与并发

1.基本概念竞态,竞争的状态 竞争共享资源共享资源 硬件(串口 LCD 声卡 。。。) 多线程可见的全局变量,多线程编程实现的生产者消费者模型中的仓库 进程之间使用的共享内存临界区,访问共享资源系统中产生竞态的原因: 1)SMP(对称多处理器) 2)任务和任务之间的抢占 3)任务和中断服务之间的抢占 4)中断服务程序和中断服务程序之间的抢占练习:希望按键能够实现独占式访问#include <linux/init.h>#include <linux/modu

2020-06-16 12:00:05 167

原创 驱动:6 内核定时器

系统时钟中断:选取一个硬件定时器,对该硬件定时器作出相应的初始化,使得该定时器产生周期性的系统时钟中断setup_irq(info->irqno, &timer_event_irqaction);timer_event_handler:会调用tick_periodic更新墙上时间计算当前线程的时间片是否耗尽如果耗尽重新执行任务调度jiffies++;…HZ:它是一个宏它对规定了每秒钟产生的系统时钟中断次数当前所使用的系统 HZ=1000tick:系统滴答时钟节拍tic

2020-06-15 17:58:51 95

原创 驱动:5.2中断处理函数的特点及底半部登记方式

函数的可重入性问题:判断一个函数是否具有可重入性的标准,就是函数是否使用了全局变量如果使用了全局变量,那么它就不具有可重入性1.中断处理函数的特点:1)短而有效率(很快直接结束)中断处理函数中不应该调用那些执行速度比较慢 比较耗时子函数2)Linux中断处理函数中,不能调用引起阻塞或者睡眠的函数copy_to_user / copy_from_user / msleep3)Linux系统中中断处理函数运行于中断上下文,使用独立的栈空间,该栈空间通常为1个物理内存页(4KB)意味着中断处理函

2020-06-13 21:11:54 926

原创 驱动:5.1Linux系统中关于按键中断异常处理

1.回顾裸板中按键中断异常是如何处理的中断触发要做的三级配置—>中断源级------>配置中断的检测模式------>中断使能—>中断控制器------>中断的优先级------>中断使能------>中断信号可以发往核------>中断是以IRQ/FIQ上报—>ARMcore级------>中断使能异常产生后硬件自动做的4件事—>1)备份CPRS—>2)修改CPRS—>3)保存返回地址到LR—&g

2020-06-13 11:47:41 351

原创 驱动:4.4设备文件的自动创建

设备文件自动创建:设备插上后自动生成对应的设备文件1.实现设备文件自动创建的条件1)根文件系统中必须存在可执行 mdev2)配置热插拔事件对应的处理方式vi /etc/init.d/rcSecho /sbin/mdev >/proc/sys/kernel/hotplug热拔插事件定义:狭义上,U盘的插入和拔出广义上,/sys目录下文件的变化3)挂载了procfs 和sysfs 虚拟设备vi /etc/fstabproc /proc proc defaults

2020-06-13 08:53:04 230

原创 驱动:3.3ioctl

用户空间:使用ioctl可以用来设置、获取设备的工作属性参数ioctl(fd,cmd);ioctl(fd,cmd,&arg);内核空间:.unlocked_ioctl = led_ioctl 为成员变量函数指针赋值实验步骤:vi led_drv.c#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <sys/ioctl.h>#define LED_

2020-06-12 16:07:36 146

原创 驱动:3.2内核空间和用户空间的数据交互

write(fd,buf,len)//调用内核中的磁盘驱动程序将用户空间buf中的数据写入到磁盘设备read(fd,buf,len)//调用内核中的磁盘驱动程序将磁盘中的数据写入到用户空间的buf原则:1)用户空间代码不能访问内核空间数据2)内核空间代码也不直接访问用户空间数据访问前先做权限检查 再找做读写操作内核中提供的间接访问用户空间数据的API:#include <linux/uaccess.h>unsigned long __must_check copy_to_us

2020-06-12 14:51:51 265

原创 驱动 :3.1内核态控制led

电路原理图:控制LED1,就是控制cpu上的GPIOC12管脚cpu datasheet:GPIOC12配置输出模式控制输出高/低电平GPIOCALTFN0GPIOCOUTENBGPIOCOUT内核态控制GPIO管脚有两种方式:1)类似裸板中直接通过特殊功能寄存器控制2)通过GPIO库函数(本质就是将操作特殊功能寄存器的过程封装起来了)这里我们使用第二种方式Linux系统中使用GPIO库函数的标准套路(gpio_left.c):1)申请GPIO管脚int gpio_requ

2020-06-12 11:20:01 193

原创 驱动 2.3 字符设备驱动编程框架

Linux内核绝大部分代码是由c语言实现的但是Linux内核中大量运用了面向对象的编程思想c语言实现面向对象主要依靠struct在内核中实现一个字符设备(例如LED 键盘 鼠标 触摸屏…)的驱动程序其本质就是实例化一个struct cdev类型的对象 并注册到内核中去即可struct cdev { //字符设备驱动框架的核心数据结构 ... const struct file_operations *ops; dev_t dev;};1.设备号本质就是一个32bit的无符号数据设

2020-06-11 00:03:31 118

原创 驱动 2.2系统调用

面试题:谈谈对系统调用的理解uc系统调用函数:open read write lseek socket bind listen accept recv fork …1.系统调用的作用 保证用户空间以安全的方式访问内核中的函数2.系统调用是如何实现的 当产生系统调用时 用户空间受限会向特定寄存器中填入一个编号 然后执行一个特殊的指令,该指令的执行会导致内核收到一个软中断异常 软中断异常后,会跳转到异常向量表执行软中断处理代码 软中断处理代码根据填入寄存器的编号 在内核中找到对应的函数,并

2020-06-10 12:19:54 166

原创 驱动:2.1模块参数

用户态编程:./a.out xxx yyy zzz内核态编程insmod xx.ko 参数1 参数2 参数3 。。。。。。为了达到以上效果 内核中提供了两个宏module param(name,type,perm)作用:将一个变量声明为模块参数name,变量名称(要把那个变量声明为模块参数)type,变量的类型支持的类型 int short long bool charp//char *perm,权限module_param_array(name,type,ptr,perm)作用

2020-06-10 10:45:06 151

原创 驱动:1.2驱动的生成

vi makefileobj-m += hello.oKERNEL = ../../linux/kernelall: make -C $(KERNEL) M=$(PWD)modulesclean: make -C $(KERNEL) M=$(PWD)clean 1 obj-m += hello.o 2 KERNEL = ../../../linux/kernel 3 4 all: 5 make -C $(KERNE...

2020-06-09 17:06:31 314

原创 驱动:1.1搭建开发环境

驱动课开发环境 -> kernel:编译通过的内核源码 板子通过tftp方式加载启动内核 -> rootfs:根文件系统数据 板子启动后nfs挂载根文件系统:/home/tarena/driver/rootfs...

2020-06-09 11:33:54 110

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除