十七:动态库和静态库
库:一堆可执行二进制文件的集合,由若干个.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);
}