资讯详情

(嵌入式基础知识)

以S3C以2410为例,有控制寄存器、数据寄存器、上拉寄存器。

(1)输入模式:浮空输入、上拉输入、下拉输入、模拟输入。

(2)输出模式:开漏输出、推挽输出、开漏复用输出、推挽复用输出。

浮空输入_IN_FLOATING

可以做浮空输入KEY识别。

带上拉输入_IPU

IO内部上拉电阻输入。

带下拉输入_IPD

IO输入内部下拉电阻。

模拟输入_AIN

应用ADC在低功耗下模拟输入或省电。

开漏输出_OUT_OD

IO输出0接GND,IO输出1悬空,输出高电平需要外部上拉电阻。当输出为1时,IO口的状态由上拉电阻拉高,但同时IO通过输入数据寄存器读取电平变化,口也可以通过外部电路拉低C51的IO双向功能。

推挽输出_OUT_PP

IO输出0接GND,IO输出1接VCC,读输入值未知。

复用功能推拉输出_AF_PP

片内外设功能(I2C的SCL,SDA)。

复用功能泄漏输出_AF_OD

片内外设功能(TX1,MOSI,MISO.SCK.SS)

总线接口

串/并

同步/异步

工作方式

速率

线路

距离

大小端

UART

串行

异步

全双工

慢,最快只有1.5Mbps

3线:RX、TX、GND

远,RS-485可达1200m

小端模式

USB

串行

同步

半双工

快,USB3.0可达5Gbps

4线:Vbus、GND、D 、D-

近,不超过5m

小端模式

SPI

串行

同步

全双工

快,可达50Mbps

3线或4线:SCLK、SIMO、SOMI、SS

远,可达10m

大端模式

IIC

串行

同步

半双工

慢,最快只有3.4Mbps

2线:SCL、SDA

近,不超过30cm

大端模式

(1)异步串行的特点:

①以字符为单位传输信息,相邻两个字符之间的间隔任意长;即字符内部同步,字符间异步;

②由于字符中的比特长度有限,只要接收时钟与发送时钟相似。

(2)同步串行的特点:

①以数据块为单位传输信息,在数据块中,字符与字符之间没有间隔;即字符内部同步,字符间同步;

②由于一次传输的数据块中包含的数据较多,因此需要严格同步接收时钟和发送时钟。

(1)时序总结:

总线空闲状态

SCL和SDA均为高电平,接上拉电阻。

启动信号(START)

在SCL保持高电平期间,SDA由高电平被拉低。由主控器发出。

数据位传送(DATA)

在SCL保持高电平期间,SDA上的电平保持稳定,低电平为数据0、高电平为数据1。用法:主控器和被控器都可发出。

应答信号(ACK)

在SCL保持高电平期间,SDA保持低电平。IIC总线上所有数据都是以8位字节传送的,发送器每发送一个字节,就在第9个时钟脉冲期间释放SDA(高电平),由接收器反馈一个ACK。

非应答信号(NACK)

在SCL保持高电平期间,SDA保持高电平。如果接收器是主控器,则它在收到最后一个字节后,发送一个NACK,通知被控器结束数据发送,并释放SDA(高电平),以便主控器发送一个STOP。

停止信号(STOP)

在SCL保持高电平时间,SDA由低电平被释放(拉高)。由主控器发出。

(2)写数据步骤:

①主机发起一个启动信号(START)。

②主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。

③从机产生应答信号(ACK)。

④主机发送8bit从机寄存器地址。

⑤从机产生应答信号(ACK)。

⑥主机发送一个字节数据。

⑦从机产生应答信号(ACK)。

⑧主机发送一个停止信号(STOP)。

(3)读数据步骤

①主机发送一个启动信号(START)。

②主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。

③从机产生一个应答信号(ACK)。

④主机发送8bit从机寄存器地址。

⑤从机产生一个应答信号。

⑥主机再次发送一个启动信号(START)。

⑦主机再次发送7bit从机地址+1bit读写选择位,1表示读、0表示写。

⑧从机产生一个应答信号(START)。

⑨主机读取一个字节数据。

⑩主机产生一个非应答信号(NACK)。之后产生一个停止信号(STOP)。

SPI的时钟极性CPOL和时钟相位CPHA可以分别为0或1,由此构成了四种组合:

①CPOL = 0,CPHA = 0:空闲时SCLK为低电平,在第一个边沿开始采样。

②CPOL = 0,CPHA = 1:空闲时SCLK为低电平,在第二个边沿开始采样。

③CPOL = 1,CPHA = 0:空闲时SCLK为高电平,在第一个边沿开始采样。

④CPOL = 1,CPHA = 1:空闲时SCLK为高电平,在第二个边沿开始采样。

(1)UART、SPI是全双工类型。

(2)IIC、USB的传输距离较短。

(1)判断端口号:首先搜索计算机可用端口,然后逐个打开,分别定时1.5秒,有数据进来则认为是目标端口。

(2)波特率判断:将本机波特率分别设置为2400、4800、9600、19200、38600、57600、115200,每个波特率定时1.5秒,对收到的ASCII码进行分析,将小于等于127的认为是正常的字符,将大于127的认为是乱码,当正常字符数目大于等于10倍乱码数目则认为当前波特率为正确波特率,并终止往后搜索。另外,也可以通过示波器判断。

可将多字节的浮点型数据分解成单字节逐个发送,接收后组合还原。

(1)使用共用体来分解

union  
{  
    float f;  
    unsigned long l;  
}data_TX;  
data_TX.f = 123.456;  

(2)发送时发送4字节(小端模式,低位先发)

TX = (unsigned char)data_TX.l;       // 低8位  
TX = (unsigned char)(data_TX.l >> 8);  
TX = (unsigned char)(data_TX.l >> 16);  
TX = (unsigned char)(data_TX.l >> 24);  // 高8位  

(3)接收端也定义同样的结构体,并接收4字节数据

union  
{  
    float f;  
    unsigned long l;  
}data_RX;  
data_RX.l = RX;      // 低8位  
data_RX.l |= RX << 8;  
data_RX.l |= RX << 16;  
data_RX.l |= RX << 24; // 高8位  

(4)最后data_RX.f == data_TX.f。

(1)UART是一种具有协议特征的收发器/接口/总线,也就是说它是一个按照特定协议来收发数据的硬件,它规定了数据按照什么格式和时序来传输。

(2)而TTL、RS-232、RS-485是三种不同的电气协议,是对电气特性的规定,作用于数据传输通路,但它并不包含对数据的处理方式。UART可以使用TTL电平,也可以使用RS-232、RS-485电平。

三种电气协议的区别:

TTL(晶体管-晶体管逻辑电平)

规定+5V(或>=2.4V)等于逻辑“1”,0V(或<=0.4V)等于逻辑“0”,噪声容限为0.4V。

RS-232

采用负逻辑传输,规定-5V ~ -15V等于逻辑“1”,+5V ~ + 15V为逻辑“0”,噪声容限为2V。

RS-485

采用差分传输,规定A线电平比B线电平高200mV以上时为逻辑“1”,A线电平比B线电平低200mV以上时为逻辑“0”。

(1)区别:

①抗干扰性:RS-485接口的抗干扰性比RS-232接口强,因为RS-485采用差分传输。

②传输距离:RS-485接口(1200m)的传输距离比RS-232接口(50m)远。

③通信能力:RS485接口在总线上允许连接多达128个收发器,而RS-232接口只允许一对一通信。

④传输速率:RS-485接口的最高传输速率为10Mbps,而RS-232接口为20Kbps。

⑤信号线:RS-485接口组成半双工网络需要两根信号线,组成全双工网络需要四根信号线;RS-232接口一般使用RXD、TXD、GND三根线组成全双工网络。

⑥电气电平值:RS-485接口规定A线电平比B线电平高200mV以上时为逻辑“1”,A线电平比B线电平低200mV以上时为逻辑“0”。RS-232接口规定-5V ~ -15V等于逻辑“1”,+5V ~ + 15V为逻辑“0”,噪声容限为2V。

(2)联系:

①都可通过DB-9连接器连接。

②均可采用屏蔽双绞线传输。

③都是串行通信。

④通信方式都是全双工(一般RS-485是半双工)。

(1)在数据位的两端添加了起始位、奇偶校验位、停止位等用于数据的同步和纠错。

(2)在接收端用16倍波特率对数据进行采样,取中间的采样值,很大程度上确保了采样数据的正确性。

可能是发送端和接收端的大小端不一致。

(1)MSB(Most Significant Bit):最高有效位,是指二进制中最高值的比特。

(2)LSB(Least Significant Bit):最低有效位,是指二进制中最低值的比特。

5/6/7/888/16

(1)异步通信(UART)和同步通信(SPI、IIC、USB等)。

(2)串行速度慢但占用资源少、线间干扰小;并行速度快但占用资源多、线间干扰相对大。

(1)CAN总线接口相对于RS-232接口的优点是抗干扰能力强、传输距离远。它采用差分传输,内置CRC校验,传输可靠性强。

(2)CAN总线接口相对于RS-485接口的优点是能构成多主系统,同一时刻可以有两个或两个以上的设备处于发送状态,适用于实时性要求高的工控领域。

1.进程&线程(16道)

如果是同步IO,当一个IO操作执行时,应用程序必须等待,直到此IO执行完。相反,异步IO操作在后台运行,IO操作和应用程序可以同时运行,提高系统性能,提高IO流量。

在同步文件IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行。而异步文件IO中,线程发送一个IO请求到内核,然后继续处理其他事情,内核完成IO请求后,将会通知线程IO操作完成了。

管道

(pipe)

是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用,通常是父子进程。

有名管道

(named pipe)

也是半双工的通信方式,但是它允许用于无亲缘关系的进程之间的通信。

信号量

(semophore)

是一个计数器,通常作为一种同步机制,用于进程和线程间的同步。

消息队列

(message queue)

是一个消息链表,存放在内核中并且由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限的缺点。

共享内存

(shared memory)

一段能够被多个进程共同访问的内存,由一个进程创建。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而设计的,往往与其他通信方式如信号量配合使用,来实现进程间同步与通信。

套接字(socket)

可用于不同主机间的进程通信。

信号(signal)

用于通知接收进程某个事件已经发生,是一种比较复杂的通信方式。

text segment

存储代码的区域。

data segment

存储初始化不为0的全局变量和静态变量、const型常量。

bss segment

存储未初始化的、初始化为0的全局变量和静态变量。

heap(堆)

用于动态开辟内存空间。

memory mapping space

(内存映射区)

mmap系统调用使用的空间,通常用于文件映射到内存或匿名映射(开辟大块空间),当malloc大于128k时(此处依赖于glibc的配置),也使用该区域。在进程创建时,会将程序用到的平台、动态链接库加载到该区域。

stack(栈)

存储函数参数、局部变量。

kernel space

存储内核代码。

(1)就绪态:所有运行条件已就绪,只要得到了CPU时间就可运行。

(2)运行态:得到CPU时间正在运行。

(3)僵尸态:进程已经结束了但父进程还没来得及回收。

(4)等待态:包括浅度睡眠跟深度睡眠。进程在等待某种条件,条件成熟后即进入就绪态。浅度睡眠时进程可以被信号唤醒,但深度睡眠时必须等到条件成熟后才能结束睡眠状态。

(5)暂停态:暂时停止参与CPU调度(即使条件成熟),可以恢复。

子进程继承父进程的绝大部分资源,包括堆栈、内存、用户号和组号、打开的文件描述符、当前工作目录、根目录。

子进程独有进程号、不同的父进程号、自己的文件描述符。

(1)进程上文:是指进程由用户态切换到内核态时需要保存用户态时CPU寄存器中的值,进程状态以及堆栈上的内容。即保存当前进程的状态,以便再次执行该进程时,能够恢复切换时的状态,继续执行。

(2)进程下文:是指切换到内核态后执行的程序,即进程运行在内核空间的部分。

(3)中断上文:硬件通过中断触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。中断上文可以看作硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被中断的进程环境)。

(4)中断下文:执行在内核空间的中断服务程序。

每当子进程退出,父进程都会收到SIGCHLD信号,故可在父进程中设置SIGCHLD信号的捕获函数,在捕获函数中回收子进程。

void* handler(int sig)  

{  

    int status;  

    if(waitpid(-1, &status, WNOHANG) >= 0)  

    {  

        printf("child is die\n");  

    }  

}  

int main()  

{  

    signal(SIGCHLD, handler);  

    int pid = fork();  

    if(pid > 0)  //父进程循环等待  

    {  

        while(1)  

        {  

            sleep(2);  

        }  

    }  

    else if(0 == pid)  

    {   //子进程说自己die后就结束生命周期,之后父进程就收到SIGCHLD  

        //信号调用handler函数接收结束子进程,打印child is die。  

        printf("i am child, i die\n");  

        exit(0);  

    }  

} 

(1)僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

(2)可用top命令查看僵尸进程的数量(zombie),也可用ps -aux | grep Z(僵尸进程的状态显示为Z)来查看僵尸进程的PID等信息。

以数字命名的目录表示当前一个运行的进程,目录名即为进程PID,其内的目录和文件给出了一些关于该进程的信息。

(1)进程是系统中程序执行和资源分配的基本单位,线程是CPU调度的基本单位。

(2)一个进程个拥有多个线程,线程可以访问其所属进程地址空间和系统资源(数据段、已经打开的文件、I/O设备等),同时也拥有自己的堆栈。

(3)同一进程中的多个线程可以共享同一地址空间,因此它们之间的通信实现也比较简单,而且切换开销小、创建和消亡的开销也小。而进程间的通信则比较麻烦,而且进程切换开销、进程创建和消亡的开销也比较大。

(1)当程序的安全性、稳定性要求较高时用多进程。

(2)需要频繁通信/切换程序/创建跟销毁程序时用多线程。

线程不能独立运行,但一个线程崩溃不一定导致整个进程崩溃。

(1)线程属于进程,线程的运行需要依赖进程的地址空间和系统资源。

(2)线程崩溃的本质就是内存出错,若出错的内存没有被其他线程访问,则不会导致其他线程出错,也就不会导致进程崩溃。

定义一个线程ID变量

pthread_t tid;

创建线程

pthread_create(&tid, NULL, pthread_func, NULL);

等待子线程结束,并回收资源

pthread_join(tid, NULL);

与当前进程分离

pthread_detach(tid);

退出调用线程

pthread_exit(NULL);

取消线程

pthread_cancel(tid);

创建互斥锁

pthread_mutex mutex = PTHREAD_MUTEX_INITIALIZER;

初始化一个互斥锁

pthread_mutex_init(&mutex, NULL);

对互斥锁上锁

pthread_mutex_lock(&mutex);

对互斥锁解锁

pthread_mutex_unlock(&mutex);

定义一个信号量

sem_t sem;

创建信号量并初始化它的值

sem_init(&sem, 0, 1);

信号量的值减1

sem_wait(&sem);

信号量的值加1

sem_post(&sem);

信号、信号量、互斥锁、条件变量、自旋锁、读写锁。

(1)方法是使用线程池。

(2)线程池可以提高调度效率和限制资源使用,线程池中的线程达到最大数时,其他线程就会排队等候。

(1)信号量用于线程同步,互斥锁用于线程互斥。

(2)信号量可以为非负整数,可以实现多个同类资源的多线程同步;互斥锁只能为0/1,只能用于一个资源的互斥访问。

(3)信号量可以由一个线程释放,另一个线程得到;互斥锁的加锁和解锁必须由同一线程分别对应使用,且多个线程使用多个互斥锁必须注意统一顺序,否则可能造成死锁。

(1)父进程先于子进程结束,此时子进程成为一个孤儿进程。

(2)Linux系统规定:所有孤儿进程都成为一个特殊进程(进程1,也就是init进程)的子进程。.

如果感觉写的还可以 但是还想再学一点点 可以去看这个专栏

1. 专刊及作者介绍_牛客博客(嫌贵的再刷一些算法题和arm架构的知识即可)

标签: 各位d2553晶体管的参数

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台