如何将.a文件如何将c语言程序导入单片机机中?

最近因为阅读源码的工作,需要自己编译一些 .so 文件或者 .a 文件,查了一些资料,写了一些示例,记录一下。

一般程序编译的过程可以分为编译链接两个阶段。链接阶段,需要把所有的obj文件(.o)链接起来,生成可执行程序,这个过程可以链接其他外部的库文件。 有时候也有省略写法。

库文件里的具体实现时对用户透明的,只是提供功能函数,而用户不能知道库文件爱你的源码实现。如果你不想开源你的具体实现,你就可以只提供库文件供别人使用。库文件分为静态库和动态库文件:

静态库:一般情况下也就是 .a 文件。静态库就是指在链接的过程中,将库文件所有数据都整合到目标代码,这样生成的可执行文件执行时就不再需要外部库支持,随便哪里运行。这样就导致了静态库编译生成的可执行库文件较大,而且当库文件需要更新改变时,可执行文件也必须重新编译生成。

动态库:一般情况下就是 .so 文件。与静态库不同,动态库文件在链接时不会将所有的代码实现整合到目标代码中,而是在可执行程序执行到相应位置时才会去库文件中搜索相应的方法。所以动态库链接生成的函数就比较小,而且库文件更新时,只需要重新生成库文件就可以了,不需要重新编译可执行程序。这就给库文件升级更新带来了极大的便利。

静态库的编译生成需要用到 ar 指令,链接过程参数 -L 表示库文件路径,-l 表示库文件名称。库文件要以 lib{name}.a 命名格式,name指库文件的名字。

 三个文件代码如上所示,编译过程如下所示。写完我发现,库文件的链接过程和.o文件类似,咋一看起来似乎直接使用.o文件更方便,那为什么不直接使用.o文件呢?其实一般情况下,库文件都是第三方库,而且由多个.o文件编译而成。.

# 正常情况下,就直接将object文件链接一起编译生成可执行程序就行了
 



动态库即是一般是指的.so 文件,与静态库相对应,动态库在编译链接过程中并不会把所有代码都编译进去,编译成的可执行文件也必须调用动态库才能正确运行,程序执行到相应位置才会去动态库中寻找函数实现。这样编译出来的可执行程序较小,且动态库可随时升级,而不需要重新编译生成可执行文件


动态库的编译需要用到 -fPIC 和 -shared 两个参数,本来跟静态库一样通过-L 和 -l 两个参数进行库文件路径和文件名的指定,但是到动态库的时候就没有成功,就直接指定了。


测试程序还是同上静态库的程序,然后做个试验,将funa.c修改,再次重新生成动态库,而不再重新编译生成 testMain 可执行文件。


执行观察结果:结果成功改变。说明动态库的更新便捷性,不需要重新编译生成可执行文件。








生成的可执行文件可以通过查看库文件依赖看是否编译成功,命令 ldd ;如果显示找不大库文件,则是库文件链接失败。





参考资料: 文章写得挺清楚,就是版面太乱了(他是转载直接复制粘贴的)。

}

单片机必读,微控制器简介– PIC16F84A入门

正如本文介绍嵌入式系统时所介绍的那样,微控制器是嵌入式系统的大脑。因此,在本文中,我将解释PIC16F84A - 来自Microchip的八位微控制器。你现在可能会问,"为什么我们从这个特定的微控制器开始,难道没有其他的吗?好吧,很明显,在介绍中讨论的实体将很容易理解。除此之外,我选择引入PIC16F84A还有一些强烈的原因,例如简单的架构,较少的指令等,

是否存在比这更简单的微控制器?– 是的。例如,PIC12F 系列。但它们太简单了,一开始就太简单了。因此,让我们继续购买我们的微控制器 - PIC16F84A。费用约为120卢比

在这里,我无法解释微控制器的所有功能,工作原理和规格,我将解释启动所需的内容(相信我,您可以利用这些知识完成很多项目)。好了,现在让我们进入游戏。

PIC16F84A是一款8位微控制器,这意味着它一次只能处理8位。它还提供各种包装。但我们只关心PDIP(塑料双列直插式封装),它通常由业余爱好者使用。以下是PIC16F84A的规格

·只有35个指令 - 这使其成为流行的RISC(精简指令集计算机)。

·15 个特殊功能寄存器(SFR)

·13 个 I/O 引脚 – 您可以将 13 个引脚单独配置为输入或输出。

·每个引脚可以拉/吸收 25mA 电流。

·支持ICSP(电路内串行编程)

·闪存可以擦除/写入10,000次。

·在内置的看门狗计时器中。

如果您不知道上面列出的功能/规格是什么,请不要惊慌,我会在适当的时候介绍所有内容。

如您所见,它是一个18引脚IC。以下是引脚说明:

引脚 5:Vss – 这是IC的接地引脚,必须连接到电池的负极。

引脚 14:Vdd – 这是IC的电源引脚,必须连接到电池的正极。(请记住,您可以使用5伏电池的最大值,电池额定值超过此值可能会损坏此伙伴)。

引脚 4:MCLR – 内存清除。这是一个低电平有效引脚。这意味着,当它保持低电平(连接到地面)时,它会执行其分配的功能。显然,此引脚用于清除临时 RAM 内存。当控制器处于工作状态时,该引脚始终连接到正电源

引脚 15 和 16:振荡器输入/输出 - 在这里您连接一个晶体振荡器。您可以使用的最大频率为20MHz。您也可以使用4MHz晶体。使用的晶体频率越高,控制器的工作速度就越快(但是他们已经为其设置了限制 - 最大20MHz,这对于使用此控制器的所有应用来说都足够快。为了获得图片,如果您使用20MHz晶体振荡器,它可以每秒执行20,000,000条指令!在这里,我们将主要使用晶体振荡器,因为它们非常便宜,易于使用,准确且体积小。

如前所述,这 13 个 I/O 引脚可以单独配置为输入或输出,每个引脚可以提供(源)电流,也可以吸收(吸收)最大 25mA 的电流。因此,每个引脚都可以轻松驱动LED,但它不能直接驱动任何直流电机,为此,我们使用称为电机驱动器的特殊IC。

我已经列出了这个PIC包含一个称为看门狗定时器的板载计时器。看门狗定时器是芯片内部的定时器。您可以通过编程来启用或禁用计时器。定时器的主要用途是当微控制器的程序出现故障或进入无限循环时,重置微控制器。为了清楚地理解看门狗计时器,请将其视为倒计时计时器,然后说,它从1000开始倒计时并归零。在程序开始时,监视程序计时器将启动。在计时器达到零之前(在我们的示例中),程序必须再次将其重新分配给 1000。即,看门狗定时器在正常操作中绝不允许归零。假设,对于每 3 条指令,我们将看门狗计时器重置为其初始值。因此,如果我们的程序中发生任何错误,或者当我们的程序进入任何无限循环时,它将无法重置看门狗定时器。因此,当定时器计数为零时,它会重置微控制器,程序从头开始。因此,看门狗定时器监视程序的工作,并在发生任何故障时重置程序。此计时器用于高级应用程序。

这里有两种类型的寄存器 - 通用寄存器(GPR)和特殊功能寄存器(SFR)。从名称中可以明显看出,通用寄存器用于存储要操作的任何任意值。特殊功能寄存器用于执行控制器件的某些功能。

在这里,如您所见,寄存器被分成两个银行,银行1和银行2(在上图中给出)。在这里,从00H到0BH和80H到8BH的寄存器是剩余的SFR是GPR。每个存储体的长度为 128 个字节,每个存储体中的前 12 个位置是为 SFR 保留的,其余的是作为静态 RAM 实现的 GPR。在这里,我们更关心的是 SFR 而不是 GFR。在这里,我将详细解释5个SFR -

地位:我们主要将此寄存器用于一个目的 - 在银行之间切换。当设置此寄存器的第五位时,我们在银行1中,当第五位重置时,我们在银行0

门:寄存器中8位中的5位对应于端口A的5个引脚(17,18,1,2和3个引脚)。此处,最低有效位对应于 RA0

端口:该寄存器的八位对应于端口 B 的 8 个引脚(6、7、8、9、10、11、12 和 13 个引脚)。这里的情况也是如此 - LSB是RB0,MSB是RB7

特里萨:该寄存器用于设置(决定)端口A引脚是输入还是输出。1 表示输入,零表示输出。例如,写入 TRISA 寄存器上的 10010 指定 RA0 配置为输出,RA1 配置为输入,RA2 配置为输出,RA3 配置为输出,RA4 配置为输入。(很清楚吗?

三分仪:TRISB寄存器的情况也是如此。它用于将端口 B 引脚配置为输入/输出。

W 寄存器:这是程序可访问的通用寄存器。您只能将值直接写入 W 寄存器。因此,当您要将值写入任何寄存器时,例如TRISA或PORTA等,您必须首先将值写入w寄存器,然后在下一步中使用另一条指令将其移动到目标寄存器。它对应于 8085 处理器中的 A 寄存器(累加器)。(注:W寄存器不在寄存器银行中。它被发现与登记银行分开。寄存器银行中的所有寄存器都无法直接访问,值只能通过W寄存器写入它们。

关注我,我将向您展示如何将程序写入此控制器。

说了这么多,大家记得留意下方评论第一条(或者私信我)有干货全套入门课程~

}

我要回帖

更多关于 如何将c语言程序导入单片机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信