zoukankan      html  css  js  c++  java
  • 嵌入式开发总结---应用篇

    实验目录:

    其间遇到的问题:

    1. 系统崩溃

      这种问题是由于当时自己修改了系统内核里面的某个.c文件引起的,然后我自己编译内核,步骤参考赛佰特PDF说明。而且,PDF里面说,烧完内核后,重启恢复到原先的内核,经过我的测试,这句话有问题。我按照PDF说明,重启直接崩溃,一直在reboot,后来就直接乱码了。

      这句话有问题:

      出现下面的问题是由于我把IP地址设置错了

      需要重新设置。

      下面的问题就是无缘无故修改内核参数所导致的问题:

    2. 重装系统

      步骤如上所示,完全按照PDF文档即可。需要说明的是,系统里面本身烧写了 tftp 工具。

      第二个注意的地方就是,网段的问题,你在arm上输入的IP和你tftp里面的IP可以不一样。

      我的开发环境是笔记本电脑,也就是说,我有两个网卡,我只需要保证pc端IP和arm的IP可以ping通即可。这个时候网线可能还没连接。

      此时我们自己设定有线的网络的IP地址即可。这样的话,本机和arm就可以相互ping通,然后我们就可以通过tftp工具去下载和上传arm系统。也就是

      uImage系统。下面的就按照文档中步骤操作下去就可以了。

    3. 关于IO口的物理连接关系

      对于板子上的连接关系,我们一般需要看cbt210-dvp底板。具体看下面的图片

    4. 关于驱动开发

      之前对驱动开发理解比较浅显,最近在做CAN开发的时候,感觉比较吃力。原来嵌入式里面也有比较多可以搞的地方。我们买的核心板都是一样的。

    当然,光核心板这一块就有很多不同款式的可以选择。但里面的东西大同小异,根据里面的资源不同,我们可以开发出很多自己想要搞的功能。

    我目前所用的开发板是 S5PV210,想要好好了解这块单片机,可以参考它的 USER-Mannal datasheet 或者它自身有的datasheet。这些都是开发必备的东西。

    对于某一款芯片来说,它的驱动都是国外人写好的东西,具体可以在下面这个目录中可以找到。

    上面是一个完整系统的源码,啥都有。

    整个系统结构如下所示:

    我们这里只是集中在Driver层,主要涉及driver层开发。这里面,出厂的时候,厂家都已经把每个管脚的功能已经驱动都写好啦。

    我们编写自己的驱动的时候,只需要调用厂家写好的驱动即可。

    这里举个例子:在adc开发中,我们根据硬件本身的写好的驱动,直接调用即可。对于linux而言,一切皆文件。

    我们只要做的就是读文件,写文件,操作文件,注册文件,关闭文件。操作文件,我们可以理解为配置文件。这是指添加一些除读写外的一些个操作。

    可以这么说,只要是板子里面管脚的复用功能,你只要连接上,都可以用它已经写好的驱动程序进行自己的工程构建。

    在此,赛佰特公司所做的工作,其实就是把核心板引脚所具有的功能,加上了外设而已。

    当然了,我刚刚也提过,对于驱动的加载有两种方式:1、编译内核 2、以模块的形式添加驱动

    两种方式各有优缺点,以模块方式添加驱动,可以收到卸载与添加,灵活性比较好。具体请参照:内核驱动入门章节部分。这个部分讲解了如何手动

    加载驱动程序。有几个关键命令:insmod mknod 等。驱动程序一般以 xxx.ko 结尾。

    第二种方式就是编译内核,一般先通过 make menuconfig 来添加或者删除指定的模块,然后make,也就是编译。编译完之后,生成某个xxImage文件,然后转换一下格式,加载到arm中即可。这个一般用tftp来搞。

    1. 关于调试

      Linux里面最大的不方便的地方就是调试,调试一般不怎么人性化,需要我们自己下载调试工具进行调试。目前一般有两种方式:1)加breakpoint。

    2)用gdb来实现,gdb有arm端和linux端的,这样的话,我们可以实现远程调试。这个还可以对程序进行分析,验证是否正确。

    参考资料:http://my.oschina.net/gzhuo/blog/323434 arm-linux gdb 调试工具的安装

    http://www.cnblogs.com/hankers/archive/2012/12/07/2806836.html gdb调试一些命令的使用

    1. 关于应用程序开发(界面有无)

      这里主要讲解有界面和无界面。有界面就是QT开发,关于QT开发现在一般在windows上面写代码,然后到linux里面就交叉编译,看看有没有错误。

      一般情况下讲,linux端的程序和arm端的程序差不多,库啥的都是可以通用的。所以QT程序的开发类似于windows下面MFC的开发。

      但是有一个不同的地方是QT是跨平台的,它可以在apple、linux、windows上面跑,源码都是一样,但是编译器却是不一样的。也就是说,你可以在windows上面跑qt程序,开发windows端的qt程序,不过此时你不能调用linux端的库函数,在某个平台上玩爽,都要遵守某个平台的规则,不能不按规则出牌。当然了,我们也可以在linux上面开发,但是这里讲一个便利点,假如你已经熟悉windows系统,你就完全可以先在windows上面把程序编好。

      然后拿到linux下面去编译,这样可以省大量的时间和精力。这点需要注意。当然,如果你的程序是要跑在arm上的,那你就用交叉编译环境去编译。然后就可以运行在arm端上面的linux系统里面了。因为是带界面的,所以需要加上 LCD库,让其能够显示。

      对于无界面的程序开发,就和vs上面编写.c 和 .h类似。不过,没有vs那么方便,需要用gdb调试。

      当然,上面讲的都是编写源码,对于源码的编译也是一个可以讲究的东西。无界面和有界面是不一样的。对于无界面程序的编译,我们现在一般需要编写 Makefile 文件。最简单的Makefile文件如下,设置好依赖库,以及每个 文件的由来,清除文件等。

      至于Makefile文件的编写,可以参考下面的资料:

      http://blog.csdn.net/haoel/article/details/2897 跟我一起写Makefile。用makefile文件有一个很好的地方就是,我们可以不需要用 静态库和动态库的方法了。当然,假如你想引入其他第三方库,就是一个.so文件的话,这个可以在Makefile文件里面配置。这里强调一点,对于驱动程序开发项目中,我们编写驱动模块的Makefile和普通英语程序是 不一样的,这个也是需要编写专门的Makefile文件,当然,这个都是可以参考其他人所写的东西。

    对于QT程序的开发,会专门生成makefile文件,不用自己专门去写。假如没有project的话,可以自己去生成,Makefile会自己生成,这个不用担心。

    1. 关于CAN开发

      最近做CAN开发的时候,遇到的问题还蛮多的,主要是自己刚开始搞,好多东西都不太会,所以需要的时间比正常人有点长。

      硬件接口:

    对于上面的接线图,其实GND和5V是可以不用接的,我们只需要接两根线canH 和 canL即可。USBCAN2那边也是。

    开发板上,用的模块是MCP2510 http://wenku.baidu.com/link?url=sgIr2WM0lg1A9G4efVooZj1Up-BgUnmxlNjdotneuA_zIOQmiv2Q2pLRKhjWlBWIcCwcWEOrOAwJtSnBunZHJOTbkDBCIa4lMe3CGcekQ0W 中文文档

    此芯片是spi与can通信的设置:http://blog.163.com/zhaozhi_q/blog/static/170060833201211165956770/

    驱动开发实例: http://blog.csdn.net/xiafeng1113/article/details/7881900

     

    还有一个问题就是时间问题:

    至今未解决,我尝试修改can发送的时间间隔发现,只要当CAN发送>100ms,此种问题出现很少。所以,我想着是否可以提高

    Can的速率,但是can速率和你发送间隔是没有关系的,这个只能说spi通讯的问题,然后尝试修改内核里面的驱动函数:

    位置:这里面有210开发板初始化时的spi速率的设定。

     

    后来,想着这个玩意与can相关,代码肯定在can驱动里面,于是又找到can驱动相关的代码:

    字符型设备:代码在此。

     

    一个小地方:

    注释掉CAN 通讯main.c里面的#define DEBUG 1,会出现调试信息看不见的情况。这个注意一下就行。

    1. 遇到的难解问题

      一个 /n 惹的祸。

      之前编写程序的时候,在主线程里面写了这么一句话:

      Printf("Ok + %d",i); //注意没有加 /n.

      这个问题纠结了我好久,之后程序可以编译通过,但就是不是像以前一样,每隔100ms给我发送数据,而是等很长时间,一次性给我发送数据。错误如下:

      刚开始的时候,我怀疑是我函数封装的有问题,就是把自己用的某几个函数封装在.c 和 .h当中,函数就在.h里面声明,变量就用extern。

      编写的时候,有一个变量是static的,然后我的can一直发送不出去,一直失败,后来我发现 原来是这个变量惹的祸,可能定义为static类型的之后,

      失去了作为全局变量的作用。因为satic 全局变量只在定义它的源文件当中有效,其他地方无效。

      参考资料: http://blog.csdn.net/keyeagle/article/details/6708077 c语言中static的用法

      对于linux当中,你的屏幕输入 stdout 也是一个文件,也是有缓存区的,可能不能一次性输入多个文件,所以上面的程序执行会出现上面的问题。

  • 相关阅读:
    Java的日期类和日期格式化类
    Java中的内部类
    c#中的里氏转换和Java中强制类型转换在多态中的应用
    MySQL存储引擎
    如何控制多线程执行顺序
    为什么 1000==1000 返回为false,而 100==100 会返回为true
    HashMap和HashTable的区别
    打印昨天的当前时刻
    怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
    MyBatis中 # 和 $ 的区别?
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/4769529.html
Copyright © 2011-2022 走看看