Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MpLab、ASM、C、建筑,以容纳两者_C_Assembly_Integration_Pic24 - Fatal编程技术网

MpLab、ASM、C、建筑,以容纳两者

MpLab、ASM、C、建筑,以容纳两者,c,assembly,integration,pic24,C,Assembly,Integration,Pic24,我有一个大型和实质性的ASM项目的PIC24芯片。(具体芯片为PIC24FJ256GB210) 我现在有一些C语言的其他例程 我想把这些纳入我的项目 C例程位于大约5个文件的项目中,其中一个包含intmain(void)语句作为起点。这是为了测试它们,让我们相信它们是有效的。我们现在准备移动该代码并将其合并到更大的现有系统中 汇编语言内容以\u reset:指令开始 我如何安排项目和构建选项,以便我可以做下面三件事 继续从我的\u reset指令开始 (或者至少确保我现有的\uu重置和int

我有一个大型和实质性的ASM项目的PIC24芯片。(具体芯片为PIC24FJ256GB210)

我现在有一些C语言的其他例程

我想把这些纳入我的项目

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

汇编语言内容以
\u reset:
指令开始

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

  • 继续从我的
    \u reset
    指令开始
  • (或者至少确保我现有的
    \uu重置
    int main(void)
    至少相互配合)
  • 从ASM代码调用他的例程
  • 使用与C代码设置相同的数据缓冲区
有趣的是,Microchip的用户论坛和示例代码部分似乎忽略了这个想法(或者,更可能的是,我还没有找到它们)

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


如果我只需要学习如何更好地搜索这个和其他网站,这将是一个有用和可行的答案本身。同样,希望我没有问重复的问题。

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

具体见第4.4节启动和初始化

“libpic30.a存档/库中包含两个C运行时启动模块 两个启动模块的入口点都是重置。链接器脚本构造一个GOTO __程序存储器中位置0处的复位指令,该指令在 设备重置。
..
5.调用函数main时没有参数。“

您的
\u重置
标签与CRT(C运行时)中的标签似乎冲突。如果您有CRT的源代码,您可以通过将CRT中的
\uuuu reset
标签重命名为其他名称来更改它,以便始终首先调用您自己的
\uu reset

另一点是,听起来您希望使用一个独立的程序,并从您自己的程序中将其用作库。由于独立程序通常被设计为执行一个或多个特定任务,并在该任务完成后退出,因此您可能需要对C代码进行一些重构,使其更像库(比如去掉
main()
函数,或者用某种
init()
函数替换它)


和第4.11节函数调用约定

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


迈克尔给了你一个很好的回答。我想补充的唯一一件事是,您应该在C中创建项目,并在其中剪切汇编函数

通过这种方式,您可以保持快速且功能强大的asm代码,并且可以用C语言维护项目,这要容易得多

将C代码转换为汇编代码并将大量汇编代码转换为mantain并不符合您的兴趣,反之亦然

阅读文档后,您将看到在C中使用汇编函数并不难,但要开始使用,您可以看看以下内容:

C:\…布拉布拉\Microchip\MPLAB C30\src\dsp\include\dsp.h

包含此文件夹中实际程序集函数的C函数声明:

C:\…布拉布拉\微芯片\MPLAB C30\src\dsp\asm

您可以从函数_VectorAdd:Vector Addition开始,文件“vadd.s”

请注意,汇编函数\u vectorad在头文件中定义为vectorad


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

谢谢。这是指向正确的方向。您能否编辑您的回复以展开首字母缩略词
CRT
?我只是在PDF手册中搜索了一下,你发现(谢谢)它的首字母缩略词是“CRT”,但没有找到一个对我来说显而易见的解释。如果我能解决这个问题,我可以重新编写C程序,让
intmain(void)
成为一个“无”例程(即
{}
或其他什么),然后将其他C函数用作“库”吗?(我认为它们通常被命名为)CRT==C运行时。在答案中添加了澄清。谢谢。在搜索时,无法确定如何在何时何地完成。我能写一个没有函数的C程序吗?
intmain(void)
?我认为这是一个要求;应用程序通常需要某种类型的
main()
函数,但库不一定需要。虽然我不熟悉如何使用Microchip的工具构建库,但我链接到的PDF可能包含一些关于该主题的信息。稍后再回答其他问题,不要让
intmain(void)
返回,因为第4.5节也包含以下内容:5。如果main返回,处理器将复位。