我有一个用于PIC24芯片的大型ASM项目。 (具体芯片为PIC24FJ256GB210)
我现在在C中有一些其他例程。
我想将这些纳入我的项目中。
C例程位于包含5个左右文件的项目中,其中一个文件包含int main(void)
语句作为起点。这是为了测试它们并让我们相信它们有效。我们现在准备移动该代码并将其合并到更大的现有系统中。
汇编语言的东西以__reset:
指令开头。
如何安排项目并构建选项,以便我可以完成以下三项工作?
__reset
指令__reset
和int main(void)
至少相互合作)有趣的是,Microchip的用户论坛和示例代码部分似乎错过了这个想法(或者,更有可能的是,我还没弄清楚如何找到它们)。
我认为这个问题已被提出很多问题,我希望我不会重复上一个问题,但我不会在这里或MicroChip的网站上看到它。欢迎链接到有关该主题的有用网站。
如果我只是需要学习如何更好地搜索这个和其他网站,那将是一个有用且可行的答案。再次,希望我不是问一个重复的问题。
答案 0 :(得分:2)
我建议您阅读DS51284H(“用于PIC24单片机的MPLAB®C编译器和dsPIC®DSC用户指南”)(PDF)。
特别参见第4.4节 STARTUP AND INITIALIZATION
“两个C运行时启动模块包含在libpic30.a存档/库中 两个启动模块的入口点是__reset。链接描述文件构造一个GOTO 程序存储器中位置0的__reset指令,用于转移控制 设备重置 .... 5.调用函数main时没有参数。“
您的__reset
标签和CRT(C运行时)中的标签似乎会发生冲突。如果您拥有CRT的来源,则可以通过将CRT中的__reset
标签重命名为其他内容来更改该内容,以便始终首先调用您自己的__reset
。
另一点是,听起来你想要一个独立的程序并将其用作你自己程序中的库。由于独立程序通常用于执行一个或多个特定任务,并在完成任务后退出,因此您可能需要稍微重构一下C代码以使其更具库(就像摆脱main()
一样函数,也许用某种init()
函数替换它。
第4.11节功能调用公约。
“前八个工作寄存器(W0-W7)用于功能参数。参数 按从左到右的顺序分配给寄存器,并将参数分配给第一个 适当对齐的可用寄存器 ....
对于8位或16位标量,函数返回值以W0返回,对于32位,W1:W0返回 标量和W3:W2:W1:64位标量的W0。“
答案 1 :(得分:0)
通过这种方式,您可以保留快速且功能强大的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开始:Vector Addition,file" vadd.s"
请注意,汇编函数 _VectorAdd 在头文件中定义为 VectorAdd 。
这个示例文件适用于DSPIC中的dsp引擎,这是PIC24没有的功能。但它仍然足以提取原理。