1

我有一个用于 PIC24 芯片的大型 ASM 项目。(具体芯片为PIC24FJ256GB210)

我现在在 C 中有一些其他的例程。

我想将这些合并到我的项目中。

C 例程在一个有 5 个左右文件的项目中,其中一个包含int main(void)作为起点的语句。这是为了测试它们并让我们相信它们可以工作。我们现在准备移动该代码并将其合并到更大的现有系统中。

汇编语言的东西从__reset:指令开始。

我如何安排项目和构建选项,以便我可以做接下来的三件事?

  • 继续从我的__reset指示开始
  • (或者至少确保我现有__reset的和int main(void)至少相互合作)
  • 从 ASM 代码调用他的例程
  • 使用 C 代码设置的相同数据缓冲区

有趣的是,Microchip 的用户论坛和示例代码部分似乎忽略了这个想法(或者,更有可能的是,我还没有弄清楚如何找到它们)。

我认为这个问题已经被问了很多,我希望我没有重复以前的问题,但我在这里和 MicroChip 的网站上都没有看到它。欢迎提供有关此主题的有用网站的链接。

如果我只需要学习如何更好地搜索此站点和其他站点,那么这本身就是一个有用且可行的答案。再次,希望我不是在问重复的问题。

4

2 回答 2

2

我建议您阅读 DS51284H(“用于 PIC24 MCU 和 dsPIC® DSC 的 MPLAB® C 编译器用户指南”)(PDF)。

特别参见第 4.4 节启动和初始化

“libpic30.a 存档/库中包含两个 C 运行时启动模块。两个启动模块的入口点都是 __reset。链接描述文件在程序存储器的位置 0 处构造 GOTO __reset 指令,该指令在设备复位时转移控制.... 5. 函数 main 被调用时没有参数。

您的__reset标签和 CRT(C 运行时)中的标签会出现冲突。如果您有 CRT 的源代码,您可以通过将__resetCRT 中的标签重命名为其他名称来更改它,以便__reset始终首先调用您自己的标签。
另一点是,听起来您想获取一个独立程序并将其用作您自己程序中的库。由于独立程序通常设计为执行一项或多项特定任务并在该任务完成后退出,您可能需要稍微重构您的 C 代码以使其更像库(比如摆脱main()函数并可能替换它具有某种init()功能)。


和第 4.11 节函数调用约定

“前八个工作寄存器(W0-W7)用于函数参数。参数按从左到右的顺序分配给寄存器,一个参数分配给第一个适当对齐的可用寄存器
......
功能对于 8 位或 16 位标量,返回值在 W0 中返回,对于 32 位标量在 W1:W0 中返回,对于 64 位标量在 W3:W2:W1:W0 中返回。”

于 2013-03-12T18:07:45.147 回答
0

迈克尔给了你一个很好的答案。我唯一想补充的是,您应该用 C 语言制作项目并在其中剪切汇编函数。

这样您就可以保留快速且实用的 asm 代码,并且可以用 C 语言维护项目,这要容易得多。

将 C 代码转换为汇编代码并保留大量汇编代码并不符合您的利益,反之亦然。

一旦你阅读了文档,你会发现在 C 中使用汇编函数并不难,但是为了让你开始,你可以看看这个:

C:\ ...bla bla... \Microchip\MPLAB C30\src\dsp\include\dsp.h

包含位于此文件夹中的实际汇编函数的 C 函数声明:

C:\ ...bla bla... \Microchip\MPLAB C30\src\dsp\asm

您可以从函数 _VectorAdd 开始:向量加法,文件“vadd.s”

注意汇编函数_VectorAdd在头文件中定义为VectorAdd 。

此示例文件适用于 DSPIC 中的 dsp 引擎,这是 PIC24 所没有的。但它仍然足以说明提取原理。

于 2015-01-04T20:24:44.223 回答