打印
[菜农群课笔记]

《工程文件及其架构》

[复制链接]
3775|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tear086|  楼主 | 2010-12-21 20:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
tear086|  楼主 | 2010-12-21 20:29 | 只看该作者
本帖最后由 tear086 于 2010-12-21 22:57 编辑

20:29:29
当今程序的架构中,首先就是要建立工程及文件。
何也????

黑鹰(593657741)  20:31:27
便于管理

20:31:32


20:32:01
在旧社会

20:32:13
只有一个asm文件

20:32:23
代码也就4KB

20:33:11
一个文本编辑器和行汇编就可生成 hex可执行文件

20:34:16
但是,在新社会,特别是ARM系列以后,没有工程文件是不可想象的

20:34:50
俺一般不太用gcc,makefile头晕乎

20:38:50
在当今的程序,开始就是建立工程

20:39:19


20:39:26
如图所示

20:39:44
它和文件夹类似

20:40:32
想到文件夹的用处自然就明白了单片机程序的工程了

20:40:56
是呀,用惯了还不错

20:41:55
工程内又可按需求分类

20:42:00
分层

20:42:41
如图有源文件,库文件等

20:43:43
俺这个例程,为了大家移植方便,和芯唐的路径完全一致

20:44:37
实际我们最关心的是如何添加自己的文件

20:44:56
俺有个恶习

20:45:46
主文件都用main.c/cpp

20:46:21
其中C是C文件,CPP为C++文件

20:46:51
可以看出,它是C++文件构成的

20:47:15
此工程包在本群内可以下载

20:48:43
如何将这些文件组合到工程里而不会编译出错或警告呢?

20:49:20
俺的恶习就是几句

20:50:11
1.函数体或变量实体都在C/CPP中

20:51:21
2.每个C/CPP都包含于自己同名的头文件h/hpp

20:52:54
3.在其头文件h中,对C中的函数或变量进行声明(不会分配空间)

20:53:26
4.所有头文件都包含main.h

20:54:21
5.在main.h中再包含所有的头文件h

20:54:45
所以,这样就组成了“桥”

20:55:03
所以永远不会出错

20:56:44
很多高手认为这些都是小事,但菜鸟一个知道

Mr.Wrong(44500789)  20:57:15
有了5为什么还要2?

20:57:54
这才能组成双向的

20:58:27
那么最重要的就是头文件H的编写了

20:59:55
这是因为自己的C间接找到main.h

21:00:38
如i2c.c->i2c.h->main.h

21:01:09
而main.c->main.h->i2c.h

21:01:38
要组成双向的通路

21:01:55
一个都不能少

Mr.Wrong(44500789)  21:01:57
这比单向有什么好处呢?

21:02:42
所以资源的使用只要在 main.h中琢磨即可

21:03:11
本来我们“电工”就是喜欢裸奔的~~~

21:06:33
现在讲H头文件的构成

21:09:46


21:10:14
这个路径应该全部是库函数

21:11:44


21:12:08
#ifndef DRVGPIO_H
#define DRVGPIO_H

#endif

21:12:35
它是防止多重定义的

21:13:41
没有它,只能用旧社会的方法,所有程序在main.c中

21:14:06
即不能构成“多文件系统”

21:14:27
否则满世界的警告和错误

CountryMan(176419557) 21:14:14
全局变量能否先声明后使用

21:17:31
应该所有C里的函数在H中都要声明一次,而且加extern修饰

21:18:01
省略不是好习惯

21:18:30
那是高级人的作为,C人一般不

21:19:14
由于是多文件架构,所以最好用extern修饰

21:19:27
而且全部在H文件中

21:23:20
记住这个头文件


21:23:43
等会说它问什么倒塌



21:24:22
用户的源文件



21:25:17
可以看到main.h包含了所有要用到的头文件

21:27:23


21:28:06
__NUC1xxSysTick_H__

21:28:29
尽量保证不可能重名

21:29:21
#ifdef __cplusplus
extern "C" {
#endif
照顾CPP人的权益

21:29:22


21:30:49
当今和谐社会,要照顾各方面的利益

21:31:40
看见没有,这个头只包含了main.h。

21:32:25
对应的C



21:33:49
节拍中断函数

21:34:30


21:34:39
初始化函数等

21:35:19
即所有和节拍定时器有关的都在此文件中

21:36:31
最好和其他无关联

21:36:41
有时很难做到

21:37:22
最重要的来了

21:37:31
COM接口技术

21:37:45
上次只是说说它的好处

21:38:54


21:39:20
这就是确实的精华所在

21:39:54
几乎看不到其用途,至少是大规模的语言应用

21:40:14
在51中

21:40:42
一般我们都是直接在中断函数中添加代码的

21:41:01
因为那时很穷

21:41:15
速度低资源少

21:41:46
我们常为简化一个字节而自豪

21:42:03
而且代价可能是几天

21:44:10
新社会了

21:44:54
不要像51愤青那么激进执着

21:45:32
为代码简化一个字节而PK

21:45:57
PC端的程序员是这样计较吗?

21:46:55
现在我们做的是如何提高编程的效率而非程序的效率

21:47:06
当然有时不是绝对的

21:47:54
愤青们编写一年节省1K字节

21:48:18
而浪费的人一月

21:49:00
难道64K的程序只用了50K荣耀,用了62K耻辱吗?

21:50:14
所以当今程序的趋势是如何快捷简化**的设计



21:55:40
回调函数大家听过吗?

21:57:04
还是上次那句话:回调---系统调用也

21:57:30
做过PC端程序的都知道

21:57:38
可能名字不同

21:57:55
你敲过键盘吗?

21:58:32
当你压键时,键盘会向主机发送中断

21:58:42
这个都明白

21:59:02
消息,事件,钩子,回调

21:59:52
由于系统级事先都已经编写好全部的程序

22:00:16
不可能知道你用否

22:00:56
假若两个人编程

22:01:11
一个人编写中断部分

22:01:28
一个人要编写中断函数

22:01:57
前者属于系统级,后者属于用户级

22:02:44
硬件有外部中断系统级编写否?

22:05:26
它不是用户主动调用的

22:06:13
是事件发生后由系统后头找用户是否需要而调用的

22:07:10
即是否安装



22:07:44
只有安装了,系统就知道用户是需求的

22:08:01
这样明白否?

22:08:44
系统“回”头“调”用

22:09:17
这样做有什么好处呢???

22:11:55
batsong@21IC(6335473)  22:10:43
事件驱动?

22:12:14
这实际就是delphi的事件驱动机制

22:12:38
或者微软的消息驱动机制

智多芯(406976951) 22:13:04
钩子函数和互调函数,大家感兴趣看看哈~
http://topic.csdn.net/t/20030820/18/2169649.html

22:13:13
就是java的事件

22:16:35
自己编的系统调用的

22:17:20
为什么PC端采用这种模式???

22:18:01
这样做的好处是团队编程

22:18:14
例如一个OS

22:18:31
给你个安装函数

22:18:59
你给出函数地址即指针即可接口

22:19:39
用户是绝对不要自己调用的

22:20:04
实际就是中断函数加校验

2:20:50
总之不是你主动调用的都算回调函数

Novermber rain(251794789)  22:21:12
这好比是姜太公钓鱼 愿者上钩了啊

22:21:23
不错

22:21:39
无鱼也无过

22:22:18
即中断即使是开放的,无用户函数系统将会空调用

22:23:05
哈哈,不错,但不一定都是os

22:23:19
os实际也就是节拍中断

22:23:47
不中断它如何抢断?

22:24:28
你不嵌入钩子,就没人上钩

22:27:28
知道好处了,那么都管理起来不更好吗?

22:28:17
用什么方式管理最合理???

22:32:20
既然要管理,就要找个好方法

22:33:20
那么为何要两个结构?

22:34:08


22:34:49
第一个结构内的一个成员指向第二个结构的首地址
第二个结构体内成员是清一色的C语言函数指针

这就是COM接口技术的精华

22:35:47
第2个成员一般是个数

22:36:04
实际安装的个数

22:36:50
因为第二个结构的长度/sizeof()就是它的总个数

22:37:20
这样可以快速地知道有几个

22:37:31
当然不是必须的

22:38:26
第2个全是函数指针即需要挂接(安装)的用户回调函数

22:38:54
初始化时,第二个结构为空

22:39:22
即没安装任何回调函数

22:39:41
当然第一个的count=0

22:40:19
现在即使中断,系统不回调即空执行

22:40:55
它可以在运行中随时卸载

22:41:45
如果中断分时段执行功能截然不同的函数

22:42:03
这样的安装就优势来了

22:42:25
51中可能用switch/case

22:42:46
来区分不同时段的调用

22:43:26
而用回调即不同时段函数的安装及卸载

22:43:43
中断程序将不再判别时段

22:44:00
程序效率不就提高了吗?

微积分(54986134)  22:44:28
好像没有看到优先极的管理??

22:44:42
所以愤青们所谓的效率都是局部的,没大局观念

可乐(93674787)  22:44:50
优先级是不是自己定义的呢?

22:45:04
这是M0的问题

22:45:52
而且俺这次推广COM接口技术就是为了程序的加密

22:46:25
COM接口技术在初始化时是空的

22:46:59
即静态编译是不知道程序入口地址的

22:47:34
那么反汇编后没任何价值的

22:48:02
必须经过debug或虚拟机后才知道其地址所在

22:49:52
俺虚拟一下

22:51:42


22:51:54
看右下角



22:53:58
这是函数指针数组的调试图



22:54:39
你也可以看“文字”

22:54:59
而且不占用任何资源

22:55:16
调试非常方便

22:55:49
这就是俺变异的 COM接口技术

使用特权

评论回复
板凳
xsgy123| | 2010-12-21 21:50 | 只看该作者
这是宣传吗:lol

使用特权

评论回复
地板
维修超人| | 2010-12-21 23:16 | 只看该作者
上课纪要

使用特权

评论回复
5
qqjj2536| | 2010-12-22 16:07 | 只看该作者
上课纪要?什么时间的?还有吗?

使用特权

评论回复
6
hotpower| | 2010-12-26 18:39 | 只看该作者
农会发放棉裤以资鼓励

使用特权

评论回复
7
sysdriver| | 2010-12-28 13:21 | 只看该作者
十几年的锤炼与精华

使用特权

评论回复
8
米其林r| | 2010-12-28 21:13 | 只看该作者
学习了

使用特权

评论回复
9
sinadz| | 2010-12-28 21:35 | 只看该作者
会议摘要

使用特权

评论回复
10
c51avr| | 2011-3-23 08:38 | 只看该作者
再看看 研究研究

使用特权

评论回复
11
hotpower| | 2011-3-24 10:15 | 只看该作者
群课笔记编辑要提高业务水平

使用特权

评论回复
12
564451696| | 2011-10-13 09:22 | 只看该作者
学习。。。。

使用特权

评论回复
13
e2zone| | 2012-1-5 21:55 | 只看该作者
都是什么东东啊!?

使用特权

评论回复
14
呆板书生| | 2012-1-12 15:59 | 只看该作者
真是好东西,学习学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:個人博客:yuphone.cnblogs.com 聯絡方式:張亞峰 15013013265@qq.com

0

主题

120

帖子

3

粉丝