John Lee<j.y.lee@yeah.net> 20:25:18
大家好
CountryMan(176419557) 20:25:28
老师好
xieguanhui<w.b.zhang1214@163.com> 20:25:33
老师好
风风(32437089) 20:25:32
FIFO发送完毕之后产生中断
风风(32437089) 20:25:34
老师好
策马西风(577141997) 20:25:40
老师好
searover79(2239458777) 20:25:43
老师好
M0菜地<murex@126.com> 20:25:57
老师好
风风(32437089) 20:26:02
都把字体改小点
风风(32437089) 20:26:08
老师用大的
雁塔菜农<hotwc3@qq.com> 20:26:10
老师好
雪狼(982332664) 20:26:22
老师好
John Lee<j.y.lee@yeah.net> 20:26:56
我找了一本C语言的书,算是照本宣科了。
M0菜地<murex@126.com> 20:27:21
雁塔菜农<hotwc3@qq.com> 20:27:23
什么书?
John Lee<j.y.lee@yeah.net> 20:27:33
书上也写得不错,我也懒得自己写材料了。
雪狼(982332664) 20:27:52
什么书?
John Lee<j.y.lee@yeah.net> 20:28:01
这个先不能说。
雪狼(982332664) 20:28:08
雁塔菜农<hotwc3@qq.com> 20:28:11
有PDF?
M0菜地<murex@126.com> 20:28:25
先开课再说
John Lee<j.y.lee@yeah.net> 20:28:35
今天我就从书里找了一章来讲。
CountryMan(176419557) 20:28:44
好
雪狼(982332664) 20:28:48
John Lee<j.y.lee@yeah.net> 20:29:19
今天讲的内容是“链接器”。
缥缈九哥(14131338) 20:29:43
起立,老师好。
潜龙思瑞(373744463) 20:30:02
老师好~~~~
雪狼(982332664) 20:30:02
老师好
John Lee<j.y.lee@yeah.net> 20:30:09
这个属于工具链的一环,相当重要,但一般书里介绍得比较少。
缥缈九哥(14131338) 20:30:51
对。我这方面 了解很薄弱。
缥缈九哥(14131338) 20:31:05
有些是自己猜测出来的。没有看过 专业的书。
John Lee<j.y.lee@yeah.net> 20:31:19
很多同学在程序开发过程中,遇到的问题,有一部分就是链接器的问题。
风雨无阻(1062514568) 20:31:36
群里怎么听课啊
雪狼(982332664) 20:31:46
就这样听
潜龙思瑞(373744463) 20:31:49
缥缈九哥(14131338) 20:31:52
就看QQ消息。
雪狼(982332664) 20:31:56
恩
风雨无阻(1062514568) 20:32:29
嗯
John Lee<j.y.lee@yeah.net> 20:33:21
一个C程序,可能是由多个分部编译的部分组成,这些不同部分通过一个通常叫做链接器的程序合并成一个整体。
John Lee<j.y.lee@yeah.net> 20:34:44
因为编译器每次只能处理一个文件,所以它不能检测出那些需要一次了解多个源程序文件才能发现的错误。
John Lee<j.y.lee@yeah.net> 20:36:59
而且,在绝大多数系统中,链接器是独立于C编译器实现的,因此如果某些逻辑错误是与C语言本身相关的,链接器也同样束手无策。
策马西风(577141997) 20:37:34
请问这个意思就是多个程序和起来有错误,但是编译器只能检测一个,所以发现不了,是这个意思不?
道可道(549040622) 20:37:54
课间提问。。。
策马西风(577141997) 20:38:04
不好意思
John Lee<j.y.lee@yeah.net> 20:38:14
欢迎提问。
John Lee<j.y.lee@yeah.net> 20:38:37
要不然我怎么知道大家有没有在听?
策马西风(577141997) 20:39:00
哦,谢谢
John Lee<j.y.lee@yeah.net> 20:40:13
编译器一次只能编译一个C程序文件,但一个工程中,可能有多个C文件。
策马西风(577141997) 20:41:00
嗯,
John Lee<j.y.lee@yeah.net> 20:41:08
编译每一个C文件时,都是成功的,但并不意味着整个程序就一定能成功。
策马西风(577141997) 20:41:42
明白
风雨无阻(1062514568) 20:41:53
嗯
策马西风(577141997) 20:42:08
就是部分成功,整体有问题
John Lee<j.y.lee@yeah.net> 20:42:15
因为编译器生成的目标文件,需要链接器合并为一个可执行文件,在链接时,也可能发生错误。
John Lee<j.y.lee@yeah.net> 20:43:08
继续。
xieguanhui<w.b.zhang1214@163.com> 20:43:19
C:\Keil\C51\BIN\c51 main.c OJ(M.OBJ)
C:\Keil\C51\BIN\c51 lcd.c OJ(L.OBJ)
C:\Keil\C51\BIN\c51 hzkasc16.c OJ(R.OBJ)
c:\keil\C51\BIN\C51 hzkasc24.c OJ(Z.OBJ)
C:\Keil\C51\BIN\c51 eeprom.c OJ(E.OBJ)
C:\Keil\C51\BIN\c51 user.c OJ(U.OBJ)
C:\Keil\C51\BIN\c51 test.c OJ(T.OBJ)
C:\Keil\C51\BIN\c51 work.c OJ(W.OBJ)
C:\Keil\C51\BIN\A51 startup.a51 OJ(A.OBJ)
C:\Keil\C51\BIN\lx51 A.OBJ,M.OBJ, L.OBJ ,R.OBJ ,Z.OBJ,E.OBJ,U.OBJ,T.OBJ,W.OBJ TO USE CO(?C_C51STARTUP1(26h))
C:\Keil\C51\BIN\Ohx51 USE
COPY USE.HEX CHIP\USE.HEX
这里的lx51是不是就如你所说的“链接器”器呢??
John Lee<j.y.lee@yeah.net> 20:43:29
对
John Lee<j.y.lee@yeah.net> 20:44:18
C语言中一个重要的思想就是分别编译,即若干个源程序可以在不同的时候单独编译,然后在恰当的时候整合到一起。
风雨无阻(1062514568) 20:45:11
继续说
John Lee<j.y.lee@yeah.net> 20:46:05
但是,链接器一般是与C编译器分离的,它不可能了解C语言的很多细节。那么,链接器是如何做到把若干个C源程序合并成一个整体呢?
John Lee<j.y.lee@yeah.net> 20:46:50
尽管链接器并不理解C语言,然而它却能够理解机器语言和内存布局。
John Lee<j.y.lee@yeah.net> 20:48:18
编译器的责任是把C源程序“编译”成对链接器有意义的形式,这样链接器就能够“间接理解”C源程序了。
寒雨(251539157) 20:49:04
听课中
(来自手机QQ: http://mobile.qq.com )
雪狼(982332664) 20:49:08
这种形式是.o类型的文件吗?
John Lee<j.y.lee@yeah.net> 20:49:18
对
雪狼(982332664) 20:49:26
恩
策马西风(577141997) 20:50:50
老师,请继续
杰GG(225426503) 20:51:51
请继续
John Lee<j.y.lee@yeah.net> 20:51:50
典型的链接器把由编译器或汇编器生成的若干个目标模块(.o),整合成一个可执行文件,该执行文件如果是native的,那么就可以马上运行,如果是cross的,那么就需要下载到目标机上运行。
转战ZigBee(772880135) 20:53:44
怎么区分 执行文件类型是native和cross。
雪狼(982332664) 20:54:00
在生成native和cross之前,有何区别?
John Lee<j.y.lee@yeah.net> 20:54:02
这些目标模块(.o),其中某些是直接作为输入提供给链接器的,而另外一些则是根据链接过程的需要,从所谓的“库文件”中取得的。
策马西风(577141997) 20:54:14
两种类型有什么区别么?
KiraVerSace<kiraversace@qq.com> 20:54:33
心理委员
转战ZigBee(772880135) 20:54:43
恩
KiraVerSace<kiraversace@qq.com> 20:54:52
现在 还在上课吗
转战ZigBee(772880135) 20:54:53
要来看我了吗
转战ZigBee(772880135) 20:54:58
在啊
KiraVerSace<kiraversace@qq.com> 20:55:06
在哪儿讲?
雪狼(982332664) 20:55:25
正在上课
雪狼(982332664) 20:55:29
John Lee<j.y.lee@yeah.net> 20:55:33
native自然是由native工具链生成的,就是通常说的本机开发工具。
雪狼(982332664) 20:56:01
那cross呢?
John Lee<j.y.lee@yeah.net> 20:56:07
cross是由交叉工具链生成的。
雪狼(982332664) 20:56:31
恩,明白
寒雨(251539157) 20:57:02
嗯
潜龙思瑞(373744463) 20:57:12
好像平时没用过CROSS
缥缈九哥(14131338) 20:57:23
单片机开发通通是。
John Lee<j.y.lee@yeah.net> 20:57:31
这种工具链,虽然是在本机执行,但生成的执行文件,却是另一种CPU或操作系统的目标代码。
雪狼(982332664) 20:57:45
恩
潜龙思瑞(373744463) 20:58:12
单片机统统是CROSS???
转战ZigBee(772880135) 20:58:29
PC-MCU 就是cros
John Lee<j.y.lee@yeah.net> 20:58:33
9g说得很对,我们平常所用的单片机开发工具,皆是cross tool。
风风(32437089) 20:58:56
这叫交叉编译
转战ZigBee(772880135) 20:59:01
恩
转战ZigBee(772880135) 20:59:05
交叉编译
策马西风(577141997) 20:59:20
明白
John Lee<j.y.lee@yeah.net> 20:59:18
嗯,一般常说的“交叉编译”
寒雨(251539157) 20:59:31
哦
寒雨(251539157) 20:59:39
这么回事
寒雨(251539157) 20:59:42
理解
John Lee<j.y.lee@yeah.net> 21:00:01
但并不严谨,因为除了编译,还需要交叉汇编,交叉链接等等。
John Lee<j.y.lee@yeah.net> 21:00:21
整个就是交叉工具链。
雪狼(982332664) 21:00:40
恩,继续
寒雨(251539157) 21:00:58
哦,加上这些就是一个工具链
John Lee<j.y.lee@yeah.net> 21:02:09
链接器通常把目标模块看成是由一组外部对象组成的。每个外部对象代表着机器内存中的某个部分,并通过一个外部名称来识别。
John Lee<j.y.lee@yeah.net> 21:03:00
因此,程序中的每个函数和每个外部变量,如果没有声明为static,就都是一个外部对象。
klusday(313536317) 21:04:23
在其它程序文件中能不能调用static定义的函数?
转战ZigBee(772880135) 21:04:34
不能。
KiraVerSace<kiraversace@qq.com> 21:05:05
不能
KiraVerSace<kiraversace@qq.com> 21:05:38
所以static 还可以用来限制本函数 或者本变量 只能在本文件中使用
KiraVerSace<kiraversace@qq.com> 21:05:56
第二个功能呢 就是 保存上一次的值
KiraVerSace<kiraversace@qq.com> 21:06:03
这是在c里面的
KiraVerSace<kiraversace@qq.com> 21:06:15
c++ 里面 还有另外一种。
策马西风(577141997) 21:06:44
老师的话,没怎么理解
John Lee<j.y.lee@yeah.net> 21:06:50
一般编译器会改变静态函数和变量的名称,使它们的名字唯一,以避免链接时发生名字冲突。
John Lee<j.y.lee@yeah.net> 21:09:13
例如:
void foo()
{
static int bar;
....
}
对于这种“静态变量”(bar),编译器可能把它的名字加上一些修饰,如:.L_foo_bar之类。
雪狼(982332664) 21:09:25
恩,这也是函数可以重载的原因
John Lee<j.y.lee@yeah.net> 21:09:59
继续
转战ZigBee(772880135) 21:10:03
都讲那么深奥。 重载是C++里面的哦。
雪狼(982332664) 21:10:18
恩,是的
雪狼(982332664) 21:10:30
我搞错了
雪狼(982332664) 21:10:38
不好意思呀
John Lee<j.y.lee@yeah.net> 21:11:12
大多数链接器都禁止同一个.o模块中的两个不同外部对象拥有相同的名字(符号)。
雁塔菜农<hotwc3@qq.com> 21:13:00
我都上传新浪微群了,谁将群课上传园地
John Lee<j.y.lee@yeah.net> 21:13:15
然而,在多个.o模块整合成一个执行文件时,这些.o模块就可能包含了同名的外部对象,链接器的一个重要工作就是处理这类符号冲突。
转战ZigBee(772880135) 21:13:27
我来。
转战ZigBee(772880135) 21:13:34
没做过菜农的笔记哦。
转战ZigBee(772880135) 21:14:06
我后进来的,前面的内容没有哦,可能有点麻烦。
John Lee<j.y.lee@yeah.net> 21:14:19
处理符号冲突,最简单的办法就是直接报错。
searover79(2239458777) 21:14:26
我传吧
道可道(549040622) 21:14:22
我有
转战ZigBee(772880135) 21:14:57
报错怎么解决。
John Lee<j.y.lee@yeah.net> 21:16:47
一个C文件中,如果有两个同名的函数,编译器就直接报错了,不会走到链接这一步的。
John Lee<j.y.lee@yeah.net> 21:19:32
但对于不同的.o文件,出现了同名函数的情况,链接器就无法处理了,试想,在一个调用此函数的地方,链接器怎么知道这个调用,应该链接给那个函数?
雪狼(982332664) 21:21:10
报链接错误?
John Lee<j.y.lee@yeah.net> 21:21:52
对于外部对象是变量的符号冲突的情况,问题不能像处理函数那么简单,不同的链接器实现,有着不同处理策略。
道可道(549040622) 21:22:01
报某个定义在两个.o中都有
xieguanhui<w.b.zhang1214@163.com> 21:23:35
提个问题,此章课程目标(目的)是什么?
John Lee<j.y.lee@yeah.net> 21:24:31
除了外部对象之外,目标模块中还可能包括了对其他模块中的外部对象的引用。
雁塔菜农<hotwc3@qq.com> 21:25:24
老师,该课间提问了。
(来自手机QQ2012 [iPhone]: http://mobile.qq.com )
风雨无阻(1062514568) 21:25:33
嗯
John Lee<j.y.lee@yeah.net> 21:25:41
例如,一个调用了printf()的源程序所生成的.o模块,就包括了一个对printf的引用。
转战ZigBee(772880135) 21:25:44
转战ZigBee(772880135) 21:26:15
抢答时间来了。 有什么奖品
雪狼(982332664) 21:26:16
请问下那些局部变量如何处置了?
雁塔菜农<hotwc3@qq.com> 21:27:07
答对的在https://bbs.21ic.com/icview-323829-1-1.html报名
转战ZigBee(772880135) 21:27:10
只是一个名称代号吧。重要的是内存分配。
雁塔菜农<hotwc3@qq.com> 21:27:39
奖品25元
雁塔菜农<hotwc3@qq.com> 21:28:03
答错了就没有
klusday(313536317) 21:28:43
问题啥哦
雁塔菜农<hotwc3@qq.com> 21:29:08
老师提问呀
雪狼(982332664) 21:29:19
时间过的好快
M0菜地<murex@126.com> 21:29:37
klusday(313536317) 21:29:26
哦,呵呵
John Lee<j.y.lee@yeah.net> 21:29:51
稍等,有一段好像有些问题。
丶砖家(1361439207) 21:30:08
PB14脚 外部中断0 低电平触发中断 结果按下按键 过了半天才进入中断服务函数 请问怎么回事啊?
John Lee<j.y.lee@yeah.net> 21:30:57
大家休息一下,我想想提什么问。
丶砖家(1361439207) 21:31:24
PB14脚 外部中断0 低电平触发中断 结果按下按键 过了半天才进入中断服务函数 请问怎么回事啊?LEE老师帮我解答一下
丶砖家(1361439207) 21:31:25
谢谢
转战ZigBee(772880135) 21:31:15
转战ZigBee(772880135) 21:31:47
你用下降沿触发中断吧。
丶砖家(1361439207) 21:32:00
外部中断0相关函数:DrvGPIO_InitFunction(E_FUNC_EXTINT0);//初始化指定功能,配置PB.14为外部中断0
DrvGPIO_EnableEINT0(E_IO_FALLING,E_MODE_EDGE,EINT0Callback);//[使能外部中断0]中断触发类型:下降沿/低电平 中断模式:边沿触发 回调函数的指针:EINT0Callback
DrvGPIO_EnableDebounce(E_GPB,14);//使能GPIO_B.14脚去抖动功能
DrvGPIO_SetDebounceTime(4,E_DBCLKSRC_10K);//(基于去抖计数器时钟源设定中断去抖采样时间) 去抖动时间:(2^10)*(10*1000)s=128*0.0001=12800us
DrvGPIO_EnableInt(E_GPB,14,E_IO_FALLING,E_MODE_EDGE);
潜龙思瑞(373744463) 21:32:08
你用了片内低速晶振了吧
转战ZigBee(772880135) 21:32:09
丶砖家(1361439207) 21:32:24
是啊 我用内部10K
雪狼(982332664) 21:31:56
潜龙思瑞(373744463) 21:32:37
那就结了
丶砖家(1361439207) 21:32:43
你的意思是去抖动的时间问题??
道可道(549040622) 21:33:30
好像外部中断无法消抖动
丶砖家(1361439207) 21:33:51
晕 难道是我数据手册看错了
丶砖家(1361439207) 21:34:22
道可道(549040622) 21:34:36
手册上没说。。。我试过一次,好像不可以,按一下就加好多次
道可道(549040622) 21:34:55
IO中断可以
KiraVerSace<kiraversace@qq.com> 21:35:04
搞个施密特触发器
道可道(549040622) 21:35:05
外部中断貌似不可以 |