- 博客(62)
- 资源 (25)
- 收藏
- 关注
转载 [openwrt] 使用ubus实现进程通信
ubus为openwrt平台开发中的进程间通信提供了一个通用的框架。它让进程间通信的实现变得非常简单,并且ubus具有很强的可移植性,可以很方便的移植到其他linux平台上使用。本文描述了ubus的实现原理和整体框架。ubus源码可通过git库 git://nbd.name/luci2/ubus.git 获得,其依赖的ubox库的git库:git://nbd.name/luci2/ubox.git...
2018-04-12 08:29:38
620
原创 IO口模拟SPI总线
SPI是一种全双工同步串行接口,四总线结构SCK、MOSI、MISO、CS分别是时钟、主机输出、主机接收、片选。其中各个厂商的写法可能不一致。SPI总线有四种工作模式,在不再做介绍。最常用的SPI总线时序CS为低时SCK上冲沿数据有效,数据从MISO、MOSI输入和输出。我们只要有这个概念就行,具体时序可以直接看芯片手册。很多芯片都集成了SPI总线接口,没有SPI接口的芯片同样可以用IO口模拟其时
2013-10-13 23:18:50
6019
1
原创 基于mini2440的看门狗(裸机)
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗",s3c2440中也集成了看门狗,在受到干扰或者系统错误时是芯片复位。
2013-09-15 20:21:12
1199
原创 基于mini2440的RTC读写(裸机)
很多处理器都有RTC实时时钟功能,s3c2440也提供了这个功能,其功能主要是:实时时钟、闹钟、tick中断等。RTC的操作比较简单。读写时RTCCON最低位应设置为1,不读写时设置为0以免误修改RTC相应寄存器。BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON,BCDYEAR可以设置和读取RTC的值,在编程中需要注意一秒只差的问题(具体可查看芯片手册),
2013-09-08 14:12:12
1296
原创 基于mini2440的IIC读写(裸机)
在mini2440开发板提供的源代码中IIC操作的源代码写的比较乱,在此根据数据手册和芯片手册,直观的编写代码,有中断模式和轮询模式,两种模式的操作方式相差不大。
2013-08-25 21:43:25
1586
1
原创 基于mini2440的ADC操作(裸机)
ADC转换器在s3c2440有集成,我在闲暇之余写的代码,有普通的轮询模式和中断模式,很多人疑问在芯片手册中只有触摸屏中断但没有说明ADC中断的相关设置位,其实是ADC中断是在转换完成了才产生中断,并不是中断了才开始转换,只要允许了ADC中断在转换完成了产生中断,这点需要区分。在完成中断后需要清除相关的标志位等待下一次中断。值得注意的是在使用中断之前需要重新映射中断地址才能使用即先调用MMU_
2013-08-09 22:44:07
830
转载 元件keepout层与覆铜间距
事情是这样,画了个板子,有个液晶模块LM3037,液晶模块安装在PCB板上,通过5mm的支撑柱支撑液晶模块,封装如下4边半径为1.5mm keep-out layer 上的是要在PCB上打孔的,一般这个软件多是默认keep-out层是板框层,板厂也是怎么做的。这里打孔还要用5mm的柱子支撑液晶模块LM3037另外在板子的背面拧螺丝。板子背面基本多是覆铜,拧螺丝的地方的覆铜间
2013-01-03 22:08:40
4640
转载 市场上常见电阻阻值表
市场上常见电阻阻值表 精度为5%的碳膜电阻,以欧姆为单位的标称值: 1.0 5.6 33 160 820 3.9K 20K 100K 510K 2.7M1.1 6.2 36 180 910 4.3K 22K 110K 56
2013-01-03 21:50:09
12218
原创 电阻的相关知识
电容的型号命名:1.各国电容器的型号命名很不统一,国产电容器的命名由四部分组成:第一部分:用字母表示名称,电容器为C。第二部分:用字母表示材料。第三部分:用数字表示分类。第四部分:用数字表示序号。2.电容的标志方法:(1)直标法:用字母和数字把型号、规格直接标在外壳上。(2)文字符号法:用数字、文字符号有规律的组合来表示容量。文字符号表示其电容量的单位:P、N、u、
2013-01-03 21:44:17
544
转载 大电容滤低频,小电容滤高频?—滤波电容的选择
一直有个疑惑:电容感抗是1/jwc,大电容c大,高频时w也大,阻抗应该很小,不是更适合滤除高频信号?然而事实却是:大电容滤除低频信号。解答如下:一般的10pF左右的电容用来滤除高频的干扰信号,0.1uF左右的用来滤除低频的纹波干扰,还可以起到稳压的作用。滤波电容具体选择什么容值要取决于你PCB上主要的工作频率和可能对系统造成影响的谐波频率,可以查一下相关厂商的电容资料或者参考厂商提供的资料
2013-01-03 20:23:31
1293
转载 板层定义介绍
顶层信号层(Top Layer):也称元件层,主要用来放置元器件,对于比层板和多层板可以用来布线;中间信号层(Mid Layer):最多可有30层,在多层板中用于布信号线.底层信号层(Bootom Layer):也称焊接层,主要用于布线及焊接,有时也可放置元器件.顶部丝印层(Top Overlayer):用于标注元器件的投影轮廓、元器件的标号、标称值或型号及各种注释字符。底部丝印层
2013-01-03 20:11:48
660
转载 如何在Altium Designer中实现两片DDR等长走线
如图所示,以ARM,DSP等SOC为核心的电子系统中,经常存在两片或者以上的DDR/DDRII SDRAM。考虑到DDR/DDRII SDRAM的运行频率一般都比较高,在做PCB layout的时候需要等长布线来保证DDR/DDRII SDRAM的读写时序。对于包含两片及以上DDR/DDRII SDRAM的系统,这里要求的等长布线有两层含义。拿ADDRESS信号来讲,第一层含义要求从SOC的某一个
2013-01-03 19:53:29
3084
原创 C语言实现bool型
bool取值false和true,是0和1的区别,,false可以代表0,但true有很多种.并非只有1。bool是在C++中的定义类型,我们如何在C中实现bool型的数据呢?我们可以利用枚举型的定义来实现,枚举型是定义常量的一种方式,默认从0一次递增,也可以自行定义,未定义的部分递增。#include #include typedef enum {false = 0, t
2012-12-14 12:21:28
1310
原创 基于51单片机的花样流水灯仿真(代码)
《单片机C语言程序设计实训100例基于8051+Proteus仿真》的例子:#include #define uchar unsigned char #define uint unsigned int uchar code Pattern_P0[]= { 0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff
2012-11-28 18:51:59
6304
1
原创 基于mini2440简单计算器的实现(裸机代码)
基于mini2440简易计算器使用的是数组实现,并非逆波兰式,因此功能不够强大,仅供驱动学习,以及C语言基础编程学习之用.有时间读者可以用逆波兰式来实现强大功能计算器,原理也很简单,建议读《c程序设计第二版》里面有算法的代码.读者自行研究.此程序基于电子相册的改进,触摸屏,LCD,字符现实,数字输入等等.主函数部分:#include "def.h"#include "option.h
2012-11-28 11:55:30
1034
原创 基于mini2440触摸屏版电子相册(裸机代码)
主函数:#include "def.h"#include "option.h"#include "2440addr.h"#include "profile.h"#define LED1_on rGPBDAT = ((0xf<<5)^(1<<5)) //GPB5=0#define LED4_on rGPBDAT = ((0xf<<5)^(1<<8)) //GPB8=0
2012-11-27 12:12:06
1916
原创 基于mini2440按键控制电子相册(裸机代码)
#define GLOBAL_CLK 1#include "def.h"#include "option.h"#include "2440addr.h"#include "profile.h"#define LCD_WIDTH 320 //屏幕宽度#define LCD_HEIGHT 240 //屏幕高度#define CLKVAL 4 //时钟信号//垂直同步信号的脉宽、
2012-11-27 11:55:52
1309
原创 基于mini2440轮询控制LED(裸机代码)
#define GLOBAL_CLK #include "def.h"#include "option.h"#include "2440addr.h" #include "2440lib.h"#include "2440slib.h" #define LED1_on rGPBDAT = ((0xf<<5)^(1<<5)) //GPB5=0#define LED2_
2012-11-27 11:53:05
566
原创 基于mini2440流水灯(裸机代码)
#include "def.h"#include "option.h"#include "2440addr.h" #include "2440lib.h"#include "2440slib.h" int System_init(void);void rDelay(unsigned int x );int Main() //主函数 { Syst
2012-11-27 11:51:32
812
原创 基于mini2440的按键中断控制LED(裸机代码)
#define GLOBAL_CLK //相当于定义了FCLK,HCLK,PCLK,UCLK#include "def.h"#include "option.h"#include "mmu.h"#include "2440addr.h"#define LED1_on rGPBDAT = ((0xf<<5)^(1<<5)) //GPB5=0#define LED2_on
2012-11-27 11:45:40
750
原创 c8051单片机和AT24c1024B的通信(IIC协议)代码
利用51单片机的I/O口来模拟IIC协议,加深对其时序的理解,其次学习AT24c1024b的读写方法.已经通过运行代码如下:#include #include//包含_nop_()函数#define CTL_R 0xa1//AT24读控制#define CTL_W 0xa0//AT24写控制sbit SCL=P1^6;sbit SDA=P1^7;void Delay(i
2012-11-17 12:16:57
3258
转载 SPI总线协议
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。 假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。 那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将所存到寄存器中去,那么这
2012-11-16 18:08:53
489
转载 Proteus ISIS与Keil uVersion开发环境的互连
Proteus ISIS与Keil uVersion开发环境的互连 【一】简介 Proteus ISIS 6 Professional是一个强大的电路仿真(VSM,Virtual System Modelling )系统,不但可以支持SPICE电路仿真,而且可以支持8051系列、PIC系列、MC68HC11等MCU的仿真,其最新的6.8SP1版本甚至可以支持ARM的仿真。你可以通过
2012-11-15 19:14:11
2792
转载 堆栈,堆栈,堆和栈的区别
堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态
2012-11-12 13:56:22
732
转载 linux fork函数与vfork函数
一、fork1. 调用方法#include #include pid_t fork(void);正确返回:在父进程中返回子进程的进程号,在子进程中返回0错误返回:-1 子进程是父进程的一个拷贝。即,子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存的方式访问。fork返回后,子进程和父进程都从调用fork
2012-11-12 13:49:49
310
转载 拓扑排序
一、概述 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(TopoiSicai Order)的序列,简称拓扑序列。注意: ①若将图中顶点按拓扑次序排成一行,则图中所有的有向边均
2012-11-12 13:32:38
464
原创 c语言单链表的基本操作(代码)
c语言实现单链表的基本操作:建立、打印、删除、插入、逆序。仅供学习之用还需不断完善,有待读者自己研究#include #include typedef struct stu{ int data; //数据 struct stu *next; //指向下一节点的指针}node;node *creat(int n)//创建链表{ node *head,*p1,*p2;
2012-11-12 13:24:49
4533
转载 实现字符串的语序翻转
如输入为“abc”输出为"cba"[cpp] view plaincopy//vs2005 #include "stdafx.h" #include #include #include using namespace std; void reverse(char *str) {
2012-11-12 13:04:49
482
1
转载 如何添加或删除ubuntu用户和组
在创建用户时,需要为新建用户指定一用户组,如果不指定其用户所属的工作组,自动会生成一个与用户名同名的工作组。创建用户user1的时候指定其所属工作组users,例:useradd –g users user1一、创建用户:1、使用命令 useradd例:useradd user1——创建用户user1 useradd –e 12/30/2009 use
2012-11-12 13:03:59
494
转载 fork与vfork的区别
fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性,但是二者之间的通讯需要通过专门的通讯机制,如:pipe,popen&pclose、协同进程、fifo,System V IPC(消息队列、信号量和共享内存)机制等, 另外通过fork创建子进程系统开销很大,需要将上面描述的每种资源都复制一个副本。这样看来,fork是一个开销十分大的系统调用,这些
2012-11-12 12:57:55
367
转载 Linux 设备驱动 ====> 字符驱动
开始从头学起linux 设备驱动,当然是先从字符驱动看起。下面仿照着书上的例子,写了一个misc 字符驱动。[cpp] view plaincopyroot@jay-LJ:/home/jay/globalmem# tree globalmem/ globalmem/ ├── globalmem.c └── Makef
2012-11-12 12:53:22
307
转载 Linux 设备驱动 ====> 并发控制 --- 原子操作
原子操作原子的操作指的就是在执行过程中不会被别的代码所中断的操作。在Linux中原子操作的方法有很多,有整型原子和位原子,他们在任何情况下操作都是原子的,这些原子操作的实现都是依赖CPU来实现的,因此这些函数都与CPU架构密切相关。整型原子我们arm架构的原子实现在kernel/arch/arm/include/asm/atomic.h1. 设置
2012-11-12 12:51:42
347
转载 Linux 设备驱动 ====> 并发控制 --- 自旋锁
自旋锁的使用自旋锁(spin_lock)是一种典型的对临界资源进行互斥访问的手段,顾名思义,为了获得一个自旋锁,在某CPU上运行的代码需要先执行一个原子操作,该操作测试并设置某个内存变量,在该操作完成之前其他执行单元不可能访问到这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行;如果测试表明锁仍被占用,程序将在一个小的循环内重复这个“测试并设置”操作,就是“自
2012-11-12 12:50:03
295
转载 Linux 设备驱动 ====> 并发控制 --- 信号量与互斥体
信号量信号量的使用信号量(semaphore)是用于保护临界区的一种常用方法,他的用法和自旋锁类似,但是,与自旋锁不同的是,当获取不到信号量时,进程不会原地打转,而是进入休眠等状态。Linux中信号量的操作主要有1.定义信号量struct semaphore sem;2.初始化信号量void sema_init(struct semaphor
2012-11-12 12:48:27
310
转载 多进程和多线程编程
1、多进程编程[cpp] view plaincopy#include #include #include int main() { pid_t child_pid; /* 创建一个子进程 */ child_pid = fork(); if(
2012-11-12 12:44:51
279
转载 fork函数实例
下面是一个fork函数的实例[cpp] view plaincopy#include #include #include int glob = 6; char buf[] = "a write to stdout\n"; int main(void) {
2012-11-12 12:41:22
392
转载 vfork函数实例
一下是vfork函数的实例,跟之前的fork函数类似[cpp] view plaincopy#include #include #include int glob = 6; int main(void) { int var; pid_t p
2012-11-12 12:39:47
366
转载 调用fork两次以避免僵死进程
如果一个进程fork一个子进程,但不要它等待子进程终止,也不希望子进程处于僵死状态直到父进程终止,实现这一要求的技巧是调用fork2次。下面是实例代码:[cpp] view plaincopy#include #include #include int main(void) {
2012-11-12 12:36:51
318
转载 Linux 中直接 I/O 机制的介绍
直接 I/O 的动机在介绍直接 I/O 之前,这一小节先介绍一下为什么会出现直接 I/O 这种机制,即传统的 I/O 操作存在哪些缺点。什么是缓存 I/O (Buffered I/O)缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page
2012-11-12 12:23:39
710
C程序设计语言(第2版·新版)(去掉了可恶的广告).pdf )
2012-10-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人