在嵌入式系统中从汇编切换到C.

时间:2015-08-25 15:38:15

标签: c assembly embedded

我需要一些建议来了解用微控制器开发C程序。我已经为汇编中的微控制器atmega开发了汇编程序。我可以说我有一些经验,因为我为传感器,电机伺服器,SD卡等开发了一些驱动程序。

现在我正在尝试用C语言开发微控制器程序。我有一些C的经验,但只有基于Linux的计算机(PC)。当我尝试用C开发一些用于特殊微控制器的程序时,我感到困惑。我不知道,在编写代码时我应该遵循哪种方法。当我在汇编中编写代码时,我总是阅读微控制器的数据表。我关注所有寄存器,所以我可以正确使用它们。但是当我在C中使用函数时,我使用它们而不知道这个函数使用了哪些寄存器。

第一个问题Q1

我是否需要了解我可能在程序中使用的函数内容?

第二个问题Q2

当我开始在c中为微控制器编写程序时。我应该做的第一步是什么?

(1)我应该从阅读数据表开始吗?

(2)我应该首先寻找集成在微控制器库中的方法,我可以将它用于我的程序并开始编写它。当我需要更准确的东西时,我可以看看数据表

我不想像在装配时那样浪费时间。我认为第二种方法比第一种方法更好。嵌入式软件专业人士的任何建议?

3 个答案:

答案 0 :(得分:4)

当您使用C语言编写微控制器时,您可以不再担心“小事”,例如CPU寄存器分配和堆栈管理,并花时间开发您需要提供的功能。当然,这需要将某些控件委托给您的编译器。然而,这通常是一个非常好的权衡,因为寄存器和堆栈跟踪可以通过计算机完成,以实现更高或相同的效率,可以手动完成。计算机还消除了人工在手动管理寄存器分配时可能引入的愚蠢但难以发现的错误。

然而,这并不意味着您可以忘记微控制器的数据表:管理ISR和I / O引脚等问题仍然是您的责任。检查编译器为您的ISR生成的代码可能是个好主意,以确保它们没有任何意外,甚至可以在汇编中编写ISR代码。

答案 1 :(得分:1)

您可以为编译器保留正常的寄存器分配。但是在某些情况下,您必须将变量或函数放在ROM中的固定位置,并且可以使用链接描述文件。此外,对于内存较小的微控制器,可能会出现堆栈溢出或碎片整理等问题,我认为调试器可以帮助您完成此步骤。

你不能离开数据表,我用c开发AVR并且总是看数据表。如果你想自己创建驱动程序库而不包括其他库,你将使用它。

答案 2 :(得分:0)

你需要花时间理解C.了解volatile,内存障碍,为什么是NULL而不是0,为什么应该避免转换,如何在内存中打包结构,以及它们的小端和大端打包或者不是差异,也许是在函数调用期间堆栈的样子,如何在体系结构中传递浮点args,函数中的静态变量如何工作,何时在声明中使用const,以及许多很多编译器标志do等。以标志-Wall开头。