毕业设计记录
12.26
linux驱动的注册或许是靠集成sturct device进行的,里面有初始化,名字等变量需要填写。或许接口就是按照规则做填空题。
需要回去好好研究一下,如果和想的一样就按照这个思路写毕设。
从net_device的init,和device那个结构体开始,两边都研究,找到接口就开始自己写。
12.27
初步设想是linux的设备驱动是靠继承设备结构体,struct device进行的,和java的概念一样;初始化要求的成员,然后通过注册到总线进行调用。
那么接下来的任务就是先构建起驱动的父类;然后写一个简单的调用程序。验证一下可行性,只要一个设备可以了,其余的都可以了;然后就是写中间层接口;暂时不管调度了
这些结构体都是通过链表链接在一起的,注册一个就算是在链表中加一个节点;和java完全两个概念,java基本不会管什么同步,因为本来就是同步的;
那么接下来就是先实现一个链表,用死循环一直调用他们的函数。
才看到driver是先init然后再去注册的~~~尴尬
接下来又是一条线索,需要从platform_data里面去找,据说是在cpu.c里面调用init的
dm9000_init_dm9000这个函数只在dm9000.c里面被调用了,其他地方没有被调用,所以第一次init是在其他地方调用的,现在怀疑两个地方,一个是platform_data里面,一个是probe函数
12.28
那现在就两方面准备,一个是抽象一个智能设备的结构体,一个是函数调用的结构体。
现在虚拟出来了两个结构体,一个是设备的实体,还未构建链表,然后就是设备的操作结构体,不知道需不需要构建链表,所以先把前者的 链表构建起来
linux链表初始化的时候采用了inline函数,不是很清楚原因,待会儿查查
define __initdata __section(.init.data)这段其实不是很理解,所以找了找资料,找到一个同行的博客,不错,待会儿再看
12/29
目标是没写一个deviece,只需要注册,按照对应的格式填写struct就行了,但现在遇到了问题,注册这里不是很清楚,所以先用函数调用试试
初始化一定要写在c文件里面?
12.30
今天什么也没做,进入了节日气氛
12.31
今天将esp8266加入进工程
突然发现c语言,好严格;而且今天的错误很难以理解,esp8266的头文件里面没有包含net-device的声明,但是在c文件里面定义了一个返回为net-device指针的函数,这个时候如果在.h文件里面写了同样返回类型的函数声明; MinGW32工具链会返回函数conflicting的错误,其实就是没有包含相应的.h文件,但是.h文件里面不会有醒目的提示;所以好自为之吧,程序员很苦逼的;多研究一下编译原理;
2017/01/02
将代码转移到mdk平台的时候出现了一些错误
.1 inline申明在mdk里面要看板子,core_cm3.h文件,inline 要用 __inline进行申明 链接
.2 初始化结构体的时候,如果要用C99方式,记得勾选C99mode 链接
1.03
由于在keil平台上编写 与 其他平台的工具链不一样,出现了u8重复定义的情况;
修改了mytype.h
需要考虑兼容性的问题
keil写cpp文件, 用会出现问题
今晚详细看看,先把demo赶出来给老师看
两个问题,一个是内联函数的互相调用之后,返回不了,进入hardfault;
第二个是两次分配malloc之后,初始化的问题,分别在esp8266.c和smartLight.c的init函数处。
1.4
今天遇到的问题比较底层,malloc函数不能分配空间了;
暂时采用的解决方法是:链接
是关于Heap_Size的,待会儿再仔细看看
1.5
首先解答一下 heap_size,这个是堆空间,但是不知道单位,所以有待跟进;
下面我想说的是MDK中C如何调用C++;这样才能让我先做的东西完全支持以前的库函数,
现在有两个方案;一个是讲croe_operation.c改cpp这样就能用C和C++分别开发驱动了,如果是c写的驱动,用extern注明一下;如果是C++写的,就能完全兼容了。
第二个就是分别编译,或者c中调用c++代码,用extern “C”是可以解决一部分问题,但是遇到了template这样的函数或者申明就报错了;继续加油把。
ok!在MDK中用C调用C++里面的函数暂时不行,因为链接的时候,生成的.o文件,函数名称不一样,链接玩C++文件生成的函数名匹配不上C的。
1.6
暂时还是用c++写core_operation吧,为了兼容之前的库函数;如果以后有更好的方法,还是愿意改回来用
c写。
在C++调用C的时候,使用调用的文件要注意不要把该文件对应的头文件也加上extern “C”;不然链接的时候会出问题.o文件链接不到对应的函数
网络设备驱动用c和C++都可以写的时候,就会出现另一个步骤,将他们统筹起来;这个时候在驱动和core_operation之间就会出现 有层,用于统筹底层驱动,然后集合成上层可以用的设备。出现一个问题:LIST_HEAD_INIT(net_list_list)在两个模板中都有定义,出现了重复定义;但是编译没问题,问题出现在了链接。multiplay define了
想到了另一个抽象,就是实例化了网络设备之后,还需要一个抽象,将所有设备全部统一管理。返回一个指针,让core_operation 层进行填充就行了。
刚刚遇到一个C++初始化的问题;struct的初始化和C的不一样,不能像.open = &opne这样调用;初始化都在构造函数或者初始化列表里面。
驱动的platform是否需要分C和C++版本?最好是不要,因为要方便core_operation层调用和抽象
1.7
昨天晚上说的链接没有看哦
今天去实验室,不见但老师;只有约时间了;
今天准备把esp8266拿来进行测试;但是缺少主机,想用老电脑试试的;过几天回去拿;
对于代码的话,我觉得还有一个问题就是:内核本身对资源的初始化这里;我这里时使用了固定的函数进行分配;没有采用注册的统一格式;所以这里是需要解决的问题。
又跳到
IMPORT SystemInit
LDR R0,=SystimeInit
这里来了,上次是由于文件里面包含了,这次是esp9266_cpp.cpp文件出问题了,待会儿回来看看。
1.8
首先,昨天的问题是由于空间不足;
然后,今天又出现了hardfault问题;原因是由于堆栈空间默认的太小;需要自己设置,HeapSize改到了800了,c8t6的上限
1.10
今天试了试把usart放局部变量,还是不行,结果是配置问题,所以先把配置搞定了再继续。
先回家把电脑拿回来调调,反正这个阶段就是驱动底层代码。
1.11
今天来试,居然能调试了,很玄学;就是配置时候的问题,不知道章帝底层代码怎么写的,没有修改配置文件就不能进入调试;有空一定查查,这样的东西对于用户来讲一定是一个不小的学习代价,今天很玄乎,就只是配置这个问题,浪费了几天;哈哈哈哈。继续敲代码。
接下来就是搭建数据链路层?---数据跑通
还是继续搭建框架。
买东西都是需要的,所以待会儿把东西买了。
刚刚想了一下,还是先看书,看看别人的思路;我的思路是先把Information这些抽象出来,形成一个单独的对象,传输给上位机的时候就通过netdevice传输就可以了;当然,在设备使用硬件资源的时候需要进行注册,就是使用usart的时候需要注册,方便core判断资源的使用情况,以及做出反馈。
1.12
两个协议,一个是接入协议,一个是控制协议;由于想比较时髦的方式就是json格式,但万一出现丢包怎么办,就非常麻烦,所以还是采用定死的协议吧;不过还是想试试用json
做一个info_manager,给处理信息的进程分配信息,把信息给隔离,处理信息的程序只需要写如何处理模板信息的就可以了,不至于关注如何驱动底层信息。相当于一个信息管理者,将信息给到管理power的人,将netdevice信息给到处理对应业务的人。
1.14
做了快20天了,~~感觉不是很好了~~;战线太长,现在想起了在上一家公司工作,其实也是兴趣递减,看来从兴趣上解决这个问题是不可能了,或许需要调节一下;一定不是兴趣出问题了,是自己计划的问题
1.15
把链路跑通了,通过网络调试助手建立了一个简单的服务器,esp8266简单的链接以及发送数据
对于此的感想:只是测试了一下数据链路的可行性而已。但是真正需要做的是整个框架以及逻辑的书写,esp8266其实不是很可靠,容易出问题。
1.16
链路通了之后就是协议的制定了,根据之前的协议 id type data sum chick。
基本数据链路设计好了;对于网络设备的传输函数有两个,一个是字符串直接发送,一个是字节流,前者只需要传输字符串首地址,后者需要填写字节个数。和java的 Input,output函数有点类似,可能也是出于这个原因才需要填写字节个数。
这一部分记录需要验证的想法
.1 通信协议用json格式。由于想快点做好毕设,所以定死了协议,采用传统的译码格式。