搞定kernel 2.6 for arm
终于都搞定了实在是爽阿!已经写成一个小文档了,那些曾经像我一样搞半天都弄不好的朋友可以借鉴一下哈哈,把东西放这了,还有个配置文档一起!
哈哈可以安心做其他的东西了,最近看到一个可以在自己机子上模仿ARM的东西好像很不错,好好研究一下再说!
Crosstool
一直没写要荒废了!去年TX给我介绍个Crosstool来编译gcc的,这个玩意是很好,但是当时怎么也弄不成功,搞的头都大了,今天才知道原来不匹配的东西你想弄还真是难!
为了能编译一个适合ARM的2.6内核,今天在一本书上看到介绍crosstool的用法!当然之前是有介绍自己一个一个介绍的慢慢的整合编译,但是费了九牛二虎之力还是不行各种错误不断,总会出现一个
/usr/include/bits/fcntl2.h:51: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
漫画
终于发现坐着不动是这么的冷,下午在学习的时候真的快冻死了,为了暖身子喝了好多开水,后来在无意中想起以前(高一的时候吧应该是)画的漫画就去翻出来看看,呵呵有些东西现在看看也不错。当时水平不低啊!所以用手机拍了下来。传上来看看。
关于SQLITE
今天在学习QT的时候,无意中见到了SQLITE这个超小型的数据库,非常迷你,3万行代码不到,很酷哦,搞嵌入式的好帮手!后来和TX说了下,他一个朋友刚好讲了关于SQLITE的一些介绍,给自己多挤点时间就借用李兄的博文一用,以下为转载
来源:http://li2z.cn/2009/01/11/sqlite/
SQLite简介
SQLite大致就是”SQL lite”,也就是一个微型的SQL解释器.它的赞助商和使用者包括mozilla,adobe,symbian等软件巨头,也算是来头不小了.
说它微型,那么它到底有多微型呢?我们可以看看它的可执行文件的大小,linux版本的打包文件是203.93 KiB,解压以后是350.88 KiB,是不是很微型呢?
除了微型之外,SQLite主要还要以下特点:
- 无须配置: SQLite不需要安装,直接解压可执行文件即可运行.
- 没有服务进程: SQLite无须通过TCP/IP等通信协议提交SQL到服务端,处理后再返回结果.
- 单个数据文件: SQLite将用户数据存于单个普通文件里面.也就是说用户只要有数据文件的读权限,就可以读取所有数据;有写权限也能改变数据.
- 数据文件可跨平台迁移: SQLite本身是跨平台的,它的数据文件同样也是跨平台的.数据文件和平台的字节序无关,也和CPU的位数无关.直接复制数据文件就可以实现数据迁移.
- 紧凑: 如上所述,SQLite的运行环境非常小,如果在编译的时候去掉不需要的功能,可以减小至170KiB,用于嵌入式环境也是没问题的.
- 松散数据类型: 不同于其他数据库的严格的数据类型检查,SQLite在尝试类型转换失败以后,允许在任何表的任何列里面插入任何类型的数据(一个例外是:整型的主键列里面只能存整型数据)
- 变长的数据记录: 任何文本都是VARCHAR
- 可读性很高的源码: 普通的程序员都能读懂,关键的变量和函数都有详细的注释.
- SQL语句编译成虚拟机器语言: SQLite把SQL语句预编译成一种类似机器预言的代码,程序员可以方便得打印出代码及代码的执行结果,这样对debug很有好处.
- 完全的公开: SQLite的源码可以任意下载使用,没有任何约束和版权(一些文档和测试代码是受开源license保护的).
- SQL语言扩展: SQLite可以模块化地添加扩展,以增强其功能
说了这么多特点,那么,SQLite究竟怎么使用呢?
在一般的linux发行版下,安装 sqlite 这个包以后,就可以使用 sqlite3 这个命令来创建和处理数据库文件了.windows/DOS则下载这个文件解压到系统目录,mac则是下载这个文件.
安装完毕以后,就可以用sqlite3 test.db这个命令来创建一个空的数据库文件了.
然后,你可以用以下命令来建立一个含有两个列的表:sqlite3 test.db "create table memos(text, priority INTEGER);"sqlite3 test.db "insert into memos values('deliver project description', 10);" sqlite3 test.db "insert into memos values('lunch with Christine', 100);"然后可以这样查询出需要的数据:
sqlite3 test.db "select * from memos where priority>20;" lunch with Christine|100很简单吧~
下面展示一下,SQLite在C语言下的用法,同样用的是上面那个test.db,我们建立一个test.c,内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #include <stdio.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char **argv){ sqlite3 *db; char *zErrMsg = 0; char SQLbuffer[1024]; int rc; if( argc!=2 ){ fprintf(stderr, "Usage: %s num\n", argv[0]); return 1; } rc = sqlite3_open("test.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } sprintf(SQLbuffer, "select * from memos where priority > %s;", argv[1]); rc = sqlite3_exec(db, SQLbuffer, callback, 0, &zErrMsg); if( rc!=SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } sqlite3_close(db); return 0; }用
gcc -lsqlite3 test.c进行编译,完成之后,执行
./a.out 30 text = lunch with Christine priority = 100怎么样,相当简单吧~
注: 文中部分内容翻译和参考自官方文档和man页.
C++中的一点遗漏
在学习QT的时候看到一个很常用的用法就是,FUCTIONG::FUCTION(QWidget *parent):QWidget(parent),自己学过C++,但是一直搞不清楚这QT里定义函数时为什么后面加个“:”然后加个语句,翻书后发现在书里一个小小的篇章里写着,C++还提供一种变量初始化方式就是在函数后面加,冒号:变量名(初始化的值)!我咋一点都不知道类!!!
留在这 过些时候解决
宏定义还不知道怎么回事,今天接触到select函数,然后碰到几个宏函数(FD_SET,FD_CLR,FD_ISSET),下面就是他的定义 不是很懂先用了再说,放在这,提醒自己去解决
FD_SET 打开类型fd_set的某一位
FD_ZERO初始化fd_set
FD_ISSET测试结构fd_set中的描述字
#define FD_CLR(fd, set) do { \
u_int __i; \
for (__i = 0; __i < ((fd_set FAR *)(set))->;fd_count ; __i++) { \
if (((fd_set FAR *)(set))->;fd_array[__i] == fd) { \
while (__i < ((fd_set FAR *)(set))->;fd_count-1) { \
((fd_set FAR *)(set))->;fd_array[__i] = \
((fd_set FAR *)(set))->;fd_array[__i+1]; \
__i++; \
} \
((fd_set FAR *)(set))->;fd_count–; \
break; \
} \
} \
} while(0)
#define FD_SET(fd, set) do { \
u_int __i; \
for (__i = 0; __i < ((fd_set FAR *)(set))->;fd_count; __i++) { \
if (((fd_set FAR *)(set))->;fd_array[__i] == (fd)) { \
break; \
} \
} \
if (__i == ((fd_set FAR *)(set))->;fd_count) { \
if (((fd_set FAR *)(set))->;fd_count < FD_SETSIZE) { \
((fd_set FAR *)(set))->;fd_array[__i] = (fd); \
((fd_set FAR *)(set))->;fd_count++; \
} \
} \
} while(0)
#define FD_ZERO(set) (((fd_set FAR *)(set))->;fd_count=0)
#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set FAR *)(set))
接触到第一块开发板-ARM9
今天还在看书,老师突然走过来,有什么疑问都和我说,还有那个你在看的ARM9好像我这有块是S3C2410的,找了半天终于把这块陈旧的开发板找了出来,哇塞,终于可以实机接触了,还是从ARM9的开始,不是ARM7TDMI的,不过也好,ARM9 阅读全文…
关于checksum
最近一段时间很忙没来写东西了,发下最近写的一个东西,一个UDP的CHECKSUM(校验和)。
在网络传送的数据包为了保证传送正确都含有效验字段,IP、arp、tcp等每个数据段都有自己的效验和。
刚开始找来个现成的IP数据包的校验和,不过后来才知道UDP和IP的校验和还有差别,所有又重新来
UDP报文的头由 发送端端口(2字节),目标端口(2字节),UDP包长度(2字节),校验和(2字节)4部分组成。
校验和的值由伪IP头,UDP头和UDP数据三部分的字串以16bit作单位进行相加后取反码(one’s complement )得到。若数据长度为基数,则最后补一个字节的0。
老师要求都用C语言写,古老的语言阿,都N年没用了,不过嵌入式的东西都用他来完成,虽然我还没接触到嵌入式的东西,用了些之前从没用过的unsigned short,取反等操作,都是接触底层的东西按照网上了解的算法得出如下:
#include
#define INDEXUDPLANG 12
void ChecksumForudp(unsigned short *str1,unsigned short *str2,int len)
{
unsigned short *sbuf;
int i;
unsigned int hi=0, lo=0, hicarry, locarry;sbuf = (unsigned short *) str1;
for (i = 0 ; i < len ; i += 2)
{
if( i != INDEXUDPLANG )
{
if( i != len-2)
{
hi += sbuf[i];
lo += sbuf[i+1];
}
else
{
hi += sbuf[i];
lo += sbuf[i+1];
}
}
else
{
hi +=sbuf[i]+sbuf[i];//加两次包长
lo +=sbuf[i+1]+sbuf[i+1];//加两次包长
}
}lo += 0×11; //加UDP协议值0×0011
hicarry = hi >> 8; //提取进位
locarry = lo >> 8;while (hicarry || locarry)
{ //将进位循环加回
hi = (hi & 0xFF) + locarry;
lo = (lo & 0xFF) + hicarry;
hicarry = hi >> 8;
locarry = lo >> 8;}
sbuf[INDEXUDPLANG]= (~hi) & 0xff; //将checksum高位放入
sbuf[INDEXUDPLANG+1]= (~lo) & 0xff; //将checksum低位放入str2 = str1;
}
int main()
{
//unsigned short str[]= {0×0a,0×99,0×35,0×0f,0×0a,0×00,0×00,0xac,0×20,0xdb,0×23,0xf1,0×00,0×0b,0×00,0×00,0×18,0×00,0×23};
unsigned short str[]= {0×0a,0×99,0×35,0×0f,0×0a,0×00,0×00,0xac,0×20,0xdb,0×23,0xf1,0×00,0×7b,0×00,0×00,0×0a,0×00,0×21,0×12
,0×01,0×10,0×13,0×58,0×04,0×80,0×83,0xd4,0×60,0×04,0×81,0×83,0xd4,0×60,0×02,0×82,0×00,0×02,0×83,0×05,0×02,0×84,0×01,0×80
,0×80,0×83,0×99,0×81,0xea,0xa9};
unsigned short *str1,*str2;
str1=str;
int i = 0;
ChecksumForudp(str1,str2,50);printf(“%x\n”,str1[12]);
printf(“%x\n”,str1[13]);
printf(“ANSWER IS 35B8!\n”);
}
还有个BUG,就是UDP包最长为65535,在进行加法hi和lo是会不会超过int 长度,在得到hicarry和locarry会不会使数据丢失,总想不明白会不会,自己数学太差了!我再琢磨琢磨!
得去装个代码查看插件,这里发出来的格式都变了郁闷


最近评论