静/动态库 IIC(arm) day58

十七:动态库和静态库

库:一堆可执行二进制文件的集合,由若干个.o文件归并生成

一:静态(链接)库:libxxx.a

生成一个独立的可执行程序(运行时仅需要一个文件即可) 使用方便 不需要安装

文件比较大

多个程序使用同一个静态库时,每个程序独立链接

库文件有改动则需要编译整个工程

c 复制代码
静态库生成:
gcc -c fun.c -o fun.o 		//生成.o文件
ar  -rcv libfun.a  fun.o	//生成静态库
gcc main.c libfun.a			//链接静态库

二:动态(链接)库:libxxx.so

编译时动态链接,可执行程序不会复制库文件,仅会在内部记录库文件 的位置等链接信息。

程序执行时,需要可执行文件及库文件同时存在,并且可执行文件能找 到库文件。

使用:

​ 1.将libxxx.so拷贝到系统PATH目录下

​ 或者

​ 2.将libxxx.so所在的 路径添加到系统PATH

生成的可执行程序较小

多个程序使用同一个库,库只需要存在一份

库文件有改动时,只需要单独更新库即可(不需要全更改),可执行程序不需要重新编译

c 复制代码
动态库生成:
gcc -fPIC -shared fun.c fun1.c -o libfun.so 
 
程序编译:
gcc  main.c  -lfun     //libfun.so必须存在于系统PATH下
gcc  main.c  -lfun  -L  ./      //指定链接路径
gcc  mian.c libfun.so -o dmain	//链接到main.c文件
./dmain							//运行库

十三:IIC

一:基础概念

SDA和SCL线都为双向的。

配制IIC总线:可以编程ICCON寄存器中的4位预分频器值来控制串行时(SCL)的频率。IIC总线接口地址被储存在IC总线地址(IICADD)寄存器中。(默认IIC总线接口地址包含一个未知值。)

二:代码

c 复制代码
#include <s3c2440.h>
#include "iic.h"

void iic_init(void)
{
	//ÅäÖÃGPE14¡¢15Òý½Å¹¦ÄÜΪIICSCL¡¢SDA
	GPECON &= ~(0xf << 28);
	GPECON |= (0xa << 28);

	IICCON = (1 << 7) | (1 << 6) | (1 << 5);
}

unsigned char iic_write(unsigned char addr, unsigned char * data, unsigned char len)
{
	unsigned char i = 0;
	IICDS = addr;
	IICSTAT = 0xf0;
	IICCON &= ~(1 << 4);
	while(!(IICCON & (1 << 4)));
	
	for(i = 0; i < len; i++)
	{
		IICDS = data[i];	
		IICCON &= ~(1 << 4);
		while(!(IICCON & (1 << 4)));
	}

	IICSTAT = 0xd0;
	IICCON &= ~(1 << 4);
	delay(100);
}
#if 0
unsigned char iic_read(unsigned char addr, unsigned char * data, unsigned char len)
{
	unsigned char i = 0;
	IICDS = addr;
	IICSTAT = 0xb0;
	IICCON &= ~(1 << 4);
	while(!(IICCON & (1 << 4)));
	
	for(i = 0; i < len; i++)
	{
		data[i] = IICDS;	
		IICCON &= ~(1 << 4);
		while(!(IICCON & (1 << 4)));
	}

	IICSTAT = 0x90;
	IICCON &= ~(1 << 4);
	delay(100);
}
#endif
unsigned char iic_read(unsigned char addr,unsigned char * data,unsigned char len)
{
	unsigned char i = 0;
	IICDS = addr;	//addr write IICDS
	IICSTAT |= (0xb0 << 0);	//0xf0 write IICSTAT
	// send IICDS date
	while(!(IICCON &(1 << 4)));

   	for(i = 0;i<len;i++)
	{
		data[i] = IICDS;
		IICCON &= ~(1 << 4);
		while(!(IICCON & (1 << 4)));
	}               
  
	IICSTAT |= (0x90 << 0);
	IICCON &= ~(1 << 4);
	delay(100);					
}