一,环境搭建
工具链下载完成
开发板的第一个APP
开发板挂载好ubuntu的NFS目录后,通过之前下载的工具链编译好hello.c,并成功在开发板上运行成功。
编译内核时报错,没有lzop命令压缩内核镜像,安装后编译成功
编译设备树,编译内核模块,编译替换内核完成
第一个驱动程序的编译和测试完成
二,线性表代码实敲
这周主要学习了《大话数据结构》的前三章,线性表可以有顺序存储结构,链式存储结构(单链表,静态链表,循环链表,双向链表)。
我看完书之后,找了视频进行学习。
hui@hui-virtual-machine:~/ds/liner/sqlist$ ls
sqlist.c sqlist.h test.c
sqlist.c这个文件里面主要写了各种函数的定义
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include "sqlist.h"
5 sqlink list_create()//创建线性表
6 {
7 //申请内存
8 sqlink L;
9
10 L=(sqlink)malloc(sizeof(sqlist));
11 if(L==NULL)
12 {
13 printf("list malloc failed\n");
14 return L;
15 }
16 //初始化
17
18 memset(L,0,sizeof(sqlist));
19 L->last=-1;//代表空值
20
21 //返回值
22 return L;
23 }
24 int list_clear(sqlink L)//清空线性表
25 {
26 //返回0为清除成功,返回-1则失败
27 if(L==NULL)
28 return -1;
29 memset(L,0,sizeof(sqlist));
30 L->last = -1;
31 return 0;
32 }
33 int list_empty(sqlink L)//判断是否为空
34 {
35 //返回1为空,返回0不为空
36 if(L->last==-1)
37 return 1;
38 else
39 return 0;
40 }
41 int list_length(sqlink L)//线性表长度
42 {
43 if(L==NULL)
44 return -1;
45 return (L->last+1);
46 }
47 int list_locate(sqlink L,data_t value)//查找元素
48 {
49
50 return 0;
51 }
52 int list_insert(sqlink L,data_t value,int pos)//插入元素
53
54 {
55 int i;
56 //检查是否已满
57 if(L->last==N-1)
58 {
59 printf("list is full\n");
60 return -1;
61 }
62 //检查插入位置是否合理
63 if(pos<0||pos>L->last+1)
64 {
65 printf("pos is invalid\n");
66 return -1;
67 }
68 //元素移动
69 for(i=L->last;i>=pos;--i)
70 {
71 L->data[i+1]=L->data[i];
72 }
73
74 //更新last
75 L->data[pos]=value;
76 L->last++;
77 return 0;
78 }
79
80 int list_show(sqlink L)
81 {
82 int i;
83
84 if(L==NULL)
85 return -1;
86 if(L->last==-1)
87 printf("list is empty\n");
88 for(i=0;i<=L->last;++i)
89 {
90 printf("%d",L->data[i]);
91 }
92 printf("\n");
93 return 0;
94 }
sqlist.h头文件中包括了函数的声明和结构体的定义
typedef int data_t;//已有类型名字,编译时候处理
#define N 5
typedef struct
{
data_t data[N];
int last;
}sqlist,*sqlink;
sqlink list_create();//创建线性表
int list_clear(sqlink L);//清空线性表
int list_empty(sqlink L);//判断是否为空
int list_length(sqlink L);//线性表长度
int list_locate(sqlink L,data_t value);//查找元素
int list_insert(sqlink L,data_t value,int pos);//插入元素
int list_show(sqlink L);
test.c中放main函数
#include <stdio.h>
#include "sqlist.h"
int main(int argc, const char *argv[])
{
sqlink L;
L=list_create();
if(L==NULL)
return -1;
list_insert(L,10,0);
list_insert(L,20,0);
list_insert(L,30,0);
list_insert(L,40,0);
list_insert(L,50,0);
list_insert(L,60,0);
list_show(L);
return 0;
}
我自己编写了一个makefile文件,用来统一编译
objects=sqlist.o test.o
main:$(objects)
gcc -o main $(objects)
sqlist.o:sqlist.c
gcc -c sqlist.c
test.o:test.c
gcc -c test.c
clean:
rm *.o
rm main
写完代码执行make命令的时候出现错误,然后根据错误提示修改了相关代码,都是些语法错误
hui@hui-virtual-machine:~/ds/liner/sqlist$ make
gcc -c sqlist.c
gcc -c test.c
gcc -o main sqlist.o test.o
hui@hui-virtual-machine:~/ds/liner/sqlist$ ./main
段错误 (核心已转储)
但最后执行文件时出错,我搜了一下,可能是因为“当你尝试访问一个值为 NULL 的指针指向的内存区域时,会发生段错误”,我重新看了遍代码,找到了问题所在
if(L=NULL)
修改为
if(L==NULL)
就可以了。
hui@hui-virtual-machine:~/ds/liner/sqlist$ make
gcc -c sqlist.c
gcc -c test.c
gcc -o main sqlist.o test.o
hui@hui-virtual-machine:~/ds/liner/sqlist$ ./main
605040302010
hui@hui-virtual-machine:~/ds/liner/sqlist$ vi sqlist.h
hui@hui-virtual-machine:~/ds/liner/sqlist$ make clean
rm *.o
rm main
这是线性表最大范围定义为128时的结果
hui@hui-virtual-machine:~/ds/liner/sqlist$ make
gcc -c sqlist.c
gcc -c test.c
gcc -o main sqlist.o test.o
hui@hui-virtual-machine:~/ds/liner/sqlist$ ./main
list is full
5040302010
这是将最大范围定为5时候的结果。
三,总结
对于vi编辑器基本熟悉了切换模式,imx6ull的环境也搭建完毕,makefile基本用法了解了,数据结果算是初步有了认识。