码迷,mamicode.com
首页 > 其他好文 > 详细

嵌入式开发总结---应用篇

时间:2015-08-29 18:36:58      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

实验目录:

技术分享

其间遇到的问题:

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

嵌入式开发总结---应用篇

标签:

原文地址:http://www.cnblogs.com/zhuxuekui/p/4769529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!