01 2014 档案
摘要:计算机串口基本理论1.什么是串口?2,什么是RS-232?3,什么是RS-422?4,什么是RS-485?5,什么是握手?1,什么是串口? 串口是计算机上一种非常通用的设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简
阅读全文
摘要:这里,我们要准备两个文件,一个是汇编文件start.S,另一个是C文件led.c。汇编文件套用C文件中的开关灯函数,C文件套用汇编文件中延时函数。//start.S .global led_init led_init: @;GPC1CON @;GPC1PUDloop: mov r0,#1 @将1存到寄存器r0中,实现LED开灯效果 bl led_ops @调用C文件中的led_ops函数,此时led_ops函数调用的参数会自动从寄存器中取,即r0 mov r0,#0 @将0存到寄存器r0中,实现LED关灯效果 bl led_ops b lo...
阅读全文
摘要:首先我们要根据开发板原理图得到控制LED灯的引脚是哪个,我们现在以LED1为例,我们已经知道LED1由S5PV210的GPC1_3控制,因此我们按如下步骤进行: 第一步是配制S5PV210的GPC1_3为输出口; 第二步我们禁止GPC1_3的上、下拉电阻功能; 第三步就是控制GPC1_3输出高电平或低电平。 要想对GPC1进行配置,那我们需要知道其配置寄存器的地址,根据S5PV210的编程手册我们可以知道: GPC1的配置寄存器地址是:0xE0200080 GPC1数据寄存器地址是:0xE0200084 GPC1上、下拉控制寄存器地址是:0...
阅读全文
摘要:1、.section 1.1、语法格式 .section section_name[,"flags"[,%type[,flag_specific_arguments]]] 1.2、作用 定义一个段,每一个段以段名为开始,以下一个段名或者文件结尾为结束。 ELF格式允许的段标志: a:可分配 w:可写段 x:执行段 1.3、举例 .section .mysection @自定义数据段,段名为“.mysection”2、预定义段 .text、.data、.bss 2.1、语法格式 ...
阅读全文
摘要:GNU ARM汇编程序设计中,每行的语法格式如下: [:] [] @comment 如果语句太长,可以将一条语句分几行来书写,在行末用“\”表示换行。“\”后不能有任何字符,包含空格和制表符(Tab) 参数说明: label:为标号,可选,可以使用字母,数字,下划线;除局部标号外,必须以字母或下划线开头。标号必须以“:”号结尾。标号大小写敏感 instruction | directive | pseudo-instruction:可选项,指令、伪指令、伪操作三者任选其一。注意:ARM指令,伪指令,伪操作,寄存器名称要么大写,要么小写,不可以大小写混合。 ...
阅读全文
摘要:一、编译器arm-linux-gcc 1、用arm-linux-gcc编译一个程序,一般它是要经过如下步骤的: 1.1、预处理阶段 编译器把上述代码中stdio.h编译进来,使用GCC的选项-E可以使GCC在预处理结束后停止编译过程,而不继续其他动作了。 1.2、编译阶段 首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,arm-linux-gcc把代码翻译成汇编语言。用户可以使用-S选项来进行查看,该选项只编译而不进行汇编,生成汇编代码。 1.3、汇编阶段 把编译阶段生成.s文件转成目标文件,使用者可使用选项...
阅读全文
摘要:ARN汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或Thumb指令。ARM伪指令包含ADR、ADRL、MOV32和LDR。一、ADR伪指令 1、作用 ADR是小范围地址读取伪指令,基于PC相对偏移地址或基于寄存器相对偏移地址读取到寄存器中,当地址值是字节对齐时,取值范围为-255到255,当地址值是字对齐时,取值范围-1020到1020 2、语法格式 ADR{}{.W} register,label 3、参数说明 3.1、.W:可选项,指定指令宽度 3.2、register:目标寄存器 3.3、label:基于PC或具有寄存器的表达式二、A...
阅读全文
摘要:交换指令将一个存储单元内容与制定的寄存器内容相交换,交换指令为进程间同步提供了一种方便的解决途径。该指令产生一堆原子Load/Store操作,该操作发生在一个连续的总线操作中,在操作期间阻止其他任何指令对该存储单元的读/写。一、通用寄存器和存储器字数据交换指令SWP 1、作用 将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。 2、语法格式 SWP{} ,,[] 3、参数说明 3.1、:确定指令的目标寄存器 3.2、:该寄存器包含将要被存储到内存单元中的数据 3.3、:内存单元地址寄...
阅读全文
摘要:ARM乘法指令完成两个数据的乘法,两个32位二进制数相乘的结果是64位的4积。其中: 1、“RadHi:RdLo”是由RdHi(最高有效32位)和RdLo(最低有效32位)链接形成的64位数,“[31:0]”只选取结果的最低有效32位 2、简单的赋值由“:=”表示 3、累加(将右边加到左边)是由“+=”表示一、MUL乘法指令 1、作用 将Rm和Rs中的值相乘,结果的最低32位保存到Rd中 2、语法格式 MUL{}{S} ,, 3、参数说明 3.1、S:S位(bit[20])决定指令的操作是否影响CPSR中的条件标志位N位和Z位的值。当S=1时,跟新CPSR...
阅读全文
摘要:这两条指令结合,可用于对CPSR或SPSR进行读/写操作。 当需要保存或修改当前模式下CPSR或SPSR的内容时,首先必须将这些内容传递到通用寄存器中1、MRS指令(Move to Register from Status Register) 1.1、作用 它将程序状态寄存器内容传输到通用寄存器 1.2、语法格式 MRS{} ,CPSR MRS{} ,SPSR 1.3、参数说明 :确定指令的目标寄存器,如果R15被用作目标寄存器,指令的执行结果不可预知,因为每执行一个指令,PC都会改变。 1.4、使用场合 1.4.1、当需要保存或修改...
阅读全文
摘要:当前程序状态寄存器CPSR可以在任何位处理器模式下被访问,它包含条件码标志、中断控制、当前处理器模式以及其他状态和控制信息。CPSR的结构图如下:一、条件标志位 CPSR最高4位:N(Negative)、Z(Zero)、C(Carry)和V(oVerflow)称为条件标志位。程序名中的算术或逻辑指令可以根据其执行结果修改这些条件标志位,之后的条件执行指令可以根据这些条件标志决定相应的指令是否被执行。各条件标志位的具体含义如下: 1、N(符号位) 该位设置为当前指令运行结果的BIT[31]的值。当两个由补码表示的有符号整数运算时,N=1表示运算的结果为负数;N=0表示结果为正数或零...
阅读全文
摘要:一、字数据传送指令作用:用于把单一的数据传入或者传出一个寄存器。 1、LDR指令 1.1、作用 根据所确定的地址模式从内存中将一个32位的字段读取到目标寄存器,如果指令中的寻址方式确定的地址不是字对齐的,则读出的数值要进行循环右移。 1.2、语法格式 LDR{} , 1.3、参数说明 确定使用哪个通用寄存器作为目标寄存器 确定了指令编码中的I、P、U、W、Rn和位 2、STR指令 2.1、作用 将一个32位的字数据写入到指令中指定的内存单元 2.2、语法格式 STR{} ,二、字节数据传送指令(LDR...
阅读全文
摘要:一、数据处理指令概述 1、概念 数据处理指令是指对存放在寄存器中的数据进行处理的指令。主要包括算术指令、逻辑指令、比较与测试指令以及乘法指令 如果在数据处理指令前使用S前缀,指令的执行结果将会影响CPSR中的标志位。 2、语法格式 数据处理指令的基本语法格式 {}{S} ,, 3、参数说明 :标志指令的条件域是否更新CPSR :指示第一源操作数寄存器 :指示目的寄存器 :指示第二源操作数 4、操作码 5、的寻址方式二、数据传送指令 1、MOV指令 1.1、作用 把一个数N送到目标寄存器Rd,其中N可以是寄存器,也可以是立即数 1.2、语法格式(...
阅读全文
摘要:一、Arm指令条件码和条件助记符二、跳转指令B 1、作用 跳转指令B使程序跳转到指定的地址执行程序(跳转范围是PC-32MB到PC+32MB) 2、指令格式(注:B后面如果有条件,条件就是紧跟在B后面,没有空格) B{} 3、参数说明 3.1、:它指示指令在什么条件下执行,可省略 3.2、:指令跳转的目标地址,指令通过下面的方法计算目标地址: A、将24位带符号的补码立即数符号扩展到32位 B、将扩展后的32位立即数左移两位 C、将得到的值加到PC寄存器中,即得到跳转的目标地址三、带连接的跳转指令BL 1、作用 带连接的跳转...
阅读全文
摘要:ARM微处理器上有37个32位的寄存器,其中有6个状态寄存器(一个CPSR,5个SPSR),其它31个为通用寄存器。在ARM的不同模式下,可以访问的物理寄存器是不同,如下图所示:从图中可知,用户模式和系统模式使用相同的物理寄存器,R0-R15,CPSR,共17个物理寄存器;FIQ模式(快速中断请求模式)中:R0-R7,R15,CPSR是和用户模式相同的物理寄存器,R8-R14是FIQ模式专有的;IRQ模式(中断请求模式)中:R0-R12,R15,CPSR和用户模式共用相同的物理寄存器,R13,R14,SPSR是IRQ模式专有的SVC模式(操作系统保护模式)中:R0-R12,R15,CPSR和用
阅读全文
摘要:一分段机制 1、什么是分段机制 分段机制就是把虚拟地址空间中的虚拟内存组织成一些长度可变的称为段的内存块单元。 2、什么是段 每个段由三个参数定义:段基地址、段限长和段属性。 段的基地址、段限长以及段的保护属性存储在一个称为段描述符的结构项中。 3、段的作用 段可以用来存放程序的代码、数据和堆栈,或者用来存放系统数据结构。 4、段的存储地址 系统中所有使用的段都包含在处理器线性地址空间中。 5、段选择符 逻辑地址包括一个段选择符或一个偏移量,段选择符是一个段的唯一标识,提供了段描述符表,段描述符表指明短的大小、访问权限和段的特权级、段类型以及段的第一个字节在线性地...
阅读全文
摘要:一内核组成部分 内核是一个操作系统的核心,主要由五个部分组成:进程调度,内存管理,虚拟文件系统,网络结构,进程间通信。 1、进程调度(SCHED) 控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。 2、内存管理(MM) 允许多个进程安全的共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总数可以超过实际内存的大小操作系统只是把当前使用的程序块保留...
阅读全文
摘要:1什么是系统调用 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。 系统服务之所以需要通过系统调用来提供给用户空间的根本原因是为了对系统进行“保护”,因为我们知道Linux的运行空间分为内核空间与用户空间,它们各自运行..
阅读全文
摘要:Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等 待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式non- block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相 同,若事件没有发生则返回一个代码来告知..
阅读全文
摘要:一 主机数据库函数#include struct hostent *gethostbyaddr(const void *addr, //地址 size_t len, //长度 int type //类型 );struct hostent *gethostbyname(const char *name); 这些函数返回的结构中至少包含以下几个成员struct hostent{ char *h_name; //主机名称 ...
阅读全文
摘要:一 什么是套接字 套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发既可以在本地单机上进行,也可以跨网络进行。 二 套接字属性 套接字的特性由3个属性确定,它们是:域,类型和协议 1 套接字的域 域指定套接字通信中的网络介质,最常见的套接字域是AF_INET,它指的是Internet网络,其底层的协议——网际(IP)只有一个地址族,它使用一种特定的方式来指定网络中的计算机,即人们常说的IP地址。 AF_UNIX域是UNIX文件系统域,即使是一台还没联网的计算机上的套接字也可以使用这个域,这个域的底层协议是文件输入/输出,而它的地址就是文件名。 2 套接字类型 ...
阅读全文
摘要:一 IPC IPC是进程间通讯,在前面,我们相继学习了进程间通讯机制有信号量,内存共享,消息队列。状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC机制的方法。二 状态命令 1 显示信号量状态用ipcs -s 2 显示共享内存状态用ipcs -m 3 显示消息队列状态用ipcs -q 4 显示所有状态用ipcs -a 5 按创建者查看ipcs -c 6 按创建时间查看ipcs -t 7 按限制的内存查看ipcs -l 8 按进程号类型查看ipcs -p 9 按摘要查看ipcs -u三 删除命令 1 ipcrm -M shmkey 在最后一个共享内存从进...
阅读全文
摘要:一 关于消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,而且,每个数据块都被认为含有一个类型,接收进程可以独立地接受含有不同类型值的数据块。可以通过发送消息来几乎完全避免命名管道的同步和阻塞问题。但是,与管道一样,每个数据块都有一个最大长度的限制,系统中所有队列所包含的全部数据块的总长度都有一个上限。 与命名管道相比,消息队列的优势是,它独立于发送和接受进程而存在,这消除了在同步命名管道的打开和关闭时可能产生的一些困难。二 相关函数#include //msgget函数创建和访问一个消息队列int msgget(key_t key, int msgflg ...
阅读全文
摘要:一 共享内存 共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。二 相关函数#include //shmget创建共享内存int shmget(key_t key, //为共享内存段命名 size_t size, //以字节为单位指定需要共享的内存容量 int shmflg //权限标志。允许一个进程创建的共享内存可以被共享内存...
阅读全文
摘要:一 信号量的基本概念 信号量:它是一个特殊变量,只允许对它进行等待和发送信号这两种操作。 假设有一个信号量变量sv P(sv):用于等待,如果sv的值大于零,就给它减去1,如果它的值等于零,就挂起该进程的执行。 V(sv):用于发送信号,如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而被挂起,就给它加1二 信号量的相关函数#include //semctl函数的作用是用来直接控制信号量信息int semctl(int sem_id, //由semget返回的信号量标识符 int sem_num, //是信号...
阅读全文
摘要:1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信。后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的
阅读全文
摘要:一 管道的作用 通常把一个进程的输出通过管道连接到另一个进程的输入。二 popen和pclose函数#include FILE *popen(const char *command, //是要运行的程序名和相应的参数 const char *open_mode //必须是“r”或者“w”,如果是其它值,errno将返回EINVAL ); int pclose(FILE *stream_to_close); popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命...
阅读全文
摘要:一 相关函数 1 发送终止信号#include int pthread_cancel(pthread_t thread); 2 设置取消状态#include int pthread_setcancelstate(int state, //取值:1 PTHREAD_CANCEL_ENABLE,这个值允许线程接受取消请求 // 2 PTHREAD_CANCEL_DISABLE,它的作用是忽略取消请求 int *oldstate //用于获取先前的取消状态 ); 3 设置取...
阅读全文
摘要:本文来自博客园:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764204.html一.线程属性线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。 1.名称:pthread_attr_init/pthread_attr_destroy 功能:对线程属性初始化/去除初始化 头文件:#include 函数原形:int pthread_...
阅读全文
摘要:一 用信号量同步 1 信号量函数的名字都以sem_开头,线程中使用的基本信号量函数有4个 2 创建信号量 #includeint sem_init(sem_t *sem, //指向信号量结构的一个指针 int pshared, //控制信号量的类型,如果其值为0,就表示这个信号量是当前进程的局部信号量,否则,这个信号量就可以在多个进程之间共享 unsighed int value //信号量的初始值 ); 这个函数初始化由sem指向的信号量对象,设置它的共享选项,并给它的一个初始的整数值。 3 信号量操作函数#in...
阅读全文
摘要:一 什么是线程 线程:是一个进程内部的一个控制序列。二 使用POSIX的注意点 1 为了使用线程函数库,必须定义宏_REENTRANT,通过定义_REENTRANT来告诉编译器我们需要可重入功能,可重入代码可以被多次调用而仍然正常工作。 2 在程序中包含头文件pthread.h,并且在编译程序时需要用选项-lpthread来链接线程库。三创建线程程序前的准备 1 创建线程#include int pthread_create(pthread_t *thread, //指向变量中将被写入一个标识符的指针 pthread_attr_t *attr, ...
阅读全文

浙公网安备 33010602011771号