嵌入式Linux开发学习记录(2)

一,环境搭建

  工具链下载完成

开发板的第一个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基本用法了解了,数据结果算是初步有了认识。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值