十七:動態庫和靜態庫
庫:一堆可執行二進制文件的集合,由若干個.o文件歸并生成
一:靜態(鏈接)庫:libxxx.a
生成一個獨立的可執行程序(運行時僅需要一個文件即可) 使用方便 不需要安裝
文件比較大
多個程序使用同一個靜態庫時,每個程序獨立鏈接
庫文件有改動則需要編譯整個工程
靜態庫生成:
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
生成的可執行程序較小
多個程序使用同一個庫,庫只需要存在一份
庫文件有改動時,只需要單獨更新庫即可(不需要全更改),可執行程序不需要重新編譯
動態庫生成:
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總線接口地址包含一個未知值。)
二:代碼
#include <s3c2440.h>
#include "iic.h"void iic_init(void)
{//????GPE14?¢15òy??1|?ü?aIICSCL?¢SDAGPECON &= ~(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 IICDSIICSTAT |= (0xb0 << 0); //0xf0 write IICSTAT// send IICDS datewhile(!(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);
}