繁体   English   中英

MpLab,ASM,C,建筑物

[英]MpLab, ASM, C, Building To accommodate both

我有一个用于PIC24芯片的大型ASM项目。 (特定的芯片是PIC24FJ256GB210)

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

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

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

汇编语言的内容以__reset:指令开头。

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

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

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

我认为这个问题已经问了很多,我希望我不要重复前面的问题,但是我在这里也没有在MicroChip的网站上看到它。 欢迎链接到有关此主题的有用网站。

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

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

特别是请参阅第4.4节“ 启动和初始化”

“ libpic30.a存档/库中包含两个C运行时启动模块。这两个启动模块的入口都是__reset。链接程序脚本在程序存储器的位置0处构造了GOTO __reset指令,该指令在设备复位时转移控制权。
....
5.调用函数main时不带参数。”

您的__reset标签和CRT(C运行时)中的标签似乎冲突。 如果您有CRT的来源,则可以通过将CRT中的__reset标签重命名为其他名称来更改它,以便始终先调用您自己的__reset
另一点是,听起来您想使用一个独立程序并将其用作您自己程序中的库。 由于独立程序通常被设计为执行一个或多个特定任务,并在该任务完成后退出,因此您可能需要对C代码进行一些重构以使其更加库化(例如摆脱main()函数和也许用某种init()函数代替它)。


以及第4.11节“ 功能调用公约”

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

迈克尔给了你一个很好的答案。 我唯一要补充的是,您应该使用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则不提供。 但是提取该原理仍然足够有说服力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM