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 也是一个文件,也是有缓存区的,可能不能一次性输入多个文件,所以上面的程序执行会出现上面的问题。

  • 相关阅读:
    AX ERROR: Could not find my mock parent, most likely I am stale 不及格的程序员
    利用Segue在视图控制器间传值的问题 不及格的程序员
    Creating a Singleton Instance 不及格的程序员
    iPad 通知 UIKeyboardWillShowNotification 不会在keyBoard处在Undock状态下接到通知 不及格的程序员
    Why RootViewController's view is rotated Automatically by System when the app first loaded? 不及格的程序员
    如何弹出UIDatePicker最好 不及格的程序员
    jQuery开始做恶了 不及格的程序员
    what is the SEL,id and IMP,Class ,Method? 不及格的程序员
    Objectivec 字符串比较的陷井 不及格的程序员
    Unable to create any keyboard shortcuts after the iOS 6.1.3 update on iPad. 不及格的程序员
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/4769529.html
Copyright © 2011-2022 走看看