Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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
C++ 在旧的嵌入式c/c++;代码_C++_C_Embedded_Mplab - Fatal编程技术网

C++ 在旧的嵌入式c/c++;代码

C++ 在旧的嵌入式c/c++;代码,c++,c,embedded,mplab,C++,C,Embedded,Mplab,如何使用现代代码分析工具,如旧的ish嵌入式c/c++源代码,最初用于编译器,如Hi-Tech c、PIC c、IAR Workbench,用于许多微控制器,而不仅仅限于Microchip的PIC、PIC16和PIC18系列 为了支持微型微控制器的有限体系结构,嵌入式编译器的供应商不得不提出c/c++语言的扩展,这些扩展已经(或尚未)出现在c语言规范中 这导致微控制器特定的头文件包含以下内容: // Register: ANSELA extern volatile unsigned char

如何使用现代代码分析工具,如旧的ish嵌入式c/c++源代码,最初用于编译器,如Hi-Tech c、PIC c、IAR Workbench,用于许多微控制器,而不仅仅限于Microchip的PIC、PIC16和PIC18系列

为了支持微型微控制器的有限体系结构,嵌入式编译器的供应商不得不提出c/c++语言的扩展,这些扩展已经(或尚未)出现在c语言规范中

这导致微控制器特定的头文件包含以下内容:

// Register: ANSELA
extern volatile unsigned char           ANSELA              @ 0xF38;
#ifndef _LIB_BUILD
asm("ANSELA equ 0F38h");
#endif

typedef union {
    struct {
        unsigned ANSB0                  :1;
        unsigned ANSB1                  :1;
        unsigned ANSB2                  :1;
        unsigned ANSB3                  :1;
        unsigned ANSB4                  :1;
        unsigned ANSB5                  :1;
    };
} ANSELBbits_t;
extern volatile ANSELBbits_t ANSELBbits @ 0xF39;

extern volatile unsigned short long     TBLPTR              @ 0xFF6;

extern volatile __bit                   ABDEN1              @ (((unsigned) &BAUDCON1)*8) + 0;
void interrupt high_priority InterruptVectorHigh(void) 
{
}

void interrupt low_priority InterruptVectorLow(void)
{
}
perl -pi -e "s/(short long)/long/g" .h
代码文件包括以下内容:

// Register: ANSELA
extern volatile unsigned char           ANSELA              @ 0xF38;
#ifndef _LIB_BUILD
asm("ANSELA equ 0F38h");
#endif

typedef union {
    struct {
        unsigned ANSB0                  :1;
        unsigned ANSB1                  :1;
        unsigned ANSB2                  :1;
        unsigned ANSB3                  :1;
        unsigned ANSB4                  :1;
        unsigned ANSB5                  :1;
    };
} ANSELBbits_t;
extern volatile ANSELBbits_t ANSELBbits @ 0xF39;

extern volatile unsigned short long     TBLPTR              @ 0xFF6;

extern volatile __bit                   ABDEN1              @ (((unsigned) &BAUDCON1)*8) + 0;
void interrupt high_priority InterruptVectorHigh(void) 
{
}

void interrupt low_priority InterruptVectorLow(void)
{
}
perl -pi -e "s/(short long)/long/g" .h
使用现代工具支持此源代码,同时确保源代码仍可与原始编译器一起使用的最简单方法是什么

编辑:


下面提供了答案。

下面的修复程序将使任何支持C18或C2x规范的编译器都能理解c代码。我还没有机会用C++测试,所以他们可能不完全符合任何C++规范。 感谢像@Antti Haapala、@Clifford和@anastaciu这样的人,他们回答了我的相关问题,并给出了更完整的答案

short-long
类型 首先,24位的
短-长
类型是一个问题,因为在c规范中不存在等价物,并且因为该类型的两个字不能用
#define
来处理。首先,我使用Perl简单地将所有特定于供应商的头文件的字符串
short-long
修改为
long
,如下所示:

// Register: ANSELA
extern volatile unsigned char           ANSELA              @ 0xF38;
#ifndef _LIB_BUILD
asm("ANSELA equ 0F38h");
#endif

typedef union {
    struct {
        unsigned ANSB0                  :1;
        unsigned ANSB1                  :1;
        unsigned ANSB2                  :1;
        unsigned ANSB3                  :1;
        unsigned ANSB4                  :1;
        unsigned ANSB5                  :1;
    };
} ANSELBbits_t;
extern volatile ANSELBbits_t ANSELBbits @ 0xF39;

extern volatile unsigned short long     TBLPTR              @ 0xFF6;

extern volatile __bit                   ABDEN1              @ (((unsigned) &BAUDCON1)*8) + 0;
void interrupt high_priority InterruptVectorHigh(void) 
{
}

void interrupt low_priority InterruptVectorLow(void)
{
}
perl -pi -e "s/(short long)/long/g" .h
注意,对于Windows上的Microchip MPLAB CX8编译器,头文件位于以下文件夹和子文件夹中:c:\Program files(x86)\Microchip\xc8\v1.33\include

但是后来我意识到,
short
类型从来没有单独使用过,所以我决定使用
#define short
简单地删除
short
部分。请注意,这将影响使用
short
的任何内容,因此我在回答中保留了这两种方法

用定义的寄存器位和字节地址@ @-符号是一个特殊的问题,因为它们不能用
#define
重新定义,所以perl再次拯救了它,这次使用两个过程来处理两个不同的语法:

perl -pi -e "s/@\s*([0-9a-fA-FxX]+)/AT($1)/g" .h
perl -pi -e "s/[@] ?+([^;]*)/AT($1)/g" .h
这些基本上是将
@
后面的任何内容包装在
AT()
中,从而允许对其进行常规定义

额外的关键字 最后一步是在编译器供应商提供的每个头文件中插入宏头。我最终得到了以下宏标题:

// Hack to allow SourceTrail to be used on this source
#if defined __XC8
  #define AT(address) @ address
#else
  #define AT(address)
  #define __bit _Bool
  #define asm(assembly)
  #define interrupt
  #define short
  #define high_priority
  #define low_priority
#endif
可以看出,除了MPLAB XC8编译器使用头文件外,任何非标准文件都会被删除。唯一的例外是
\u bit
类型,它被重新定义为
\u Bool
类型-它似乎可以工作

作为批处理脚本在windows上运行的完整修复程序 由于我在windows上运行所有这些,Perl one Liner并不像在Linux上那样工作,所以为了处理每个头文件,我必须将Perl命令打包成批for循环,这相当慢。为了弥补这个缺陷,我将所有内容合并到一个名为
fix.cmd
的批处理中,该批处理放在include文件夹中(请参见上面的路径):

要执行修改,请打开一个提升的提示符,cd到包含文件,然后执行
fix.cmd

先决条件 Perl必须安装在Windows计算机上。我用

编辑: 大部分是固定的打字错误。
阐明了有两种选择来处理短-长

事实证明,每个人都坚持标准C:)绝对是有原因的。但是在微控制器的嵌入式代码的情况下,标准C并不能解决有限架构的解决方案,因此必须进行黑客攻击。一个微型微控制器只有几kB的闪存来存储硬编码程序,有时只有几百字节的RAM和硬编码寄存器/向量。如果c标准也发展到包括微型嵌入式系统,那就太好了。除了内联汇编和太多实现位域的自由外,所有东西都可以转换成标准c。MCU制造商只是太懒了,他们的c编译器达不到标准。@Lundin感谢您的链接和出色的编写!对于如何以符合C标准的方式访问24位
short-long
类型(适合24位寄存器),您是否也有建议?@fsteff最常见的做法是使用另一个非标准关键字
far
。也就是说:
fartintx
是在24位地址空间中声明的整数,
int*far ptr
是指向24位地址空间中整数的指针。