This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320C6748:写入错误:CIO文件中的文件ID无效

Guru**** 2589280 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/615177/ccs-tms320c6748-write-error-invalid-file-id-in-cio-file

部件号:TMS320C6748

工具/软件:Code Composer Studio

您好!

我正在使用C6748开发套件。 我正在使用Code Composer v7从GPIO引脚读取数据并将结果存储在阵列中。 当我尝试运行我的代码时,我收到如下所示的错误:

[C674x_0]写错误:CIO消息中的文件ID (3.0091万)无效!

我一直在查看有关此问题的其他帖子,并遵循了所提出的一些建议,例如增加堆栈和堆大小,以及将.sysmem放入DDR2内存。 基于这些变化,我觉得我应该有足够的空间来存储我收集的数据。 我还在对我的“数组”使用malloc函数,我认为应该将所有内容分配到堆中。 我确实有一个printf语句,我读了它可能会导致问题,但我看不出它有什么问题。  

我的代码如下:

/**
主要c
*/


包含"gPIO.h"
#include <stdio.h>
包括"SOC_C6748.h"
包括"lcdkC6748.h"
包括"HW_syscfg0_C6748.h"
#include <stdlib.h>
包含"PSC.h"
包括"HW_Types.h"
#define _SOC_C6748_H_


//#定义EMIFA_READ_SETUP_RESETVAL (0x00)
//#定义EMIFA_READ_STROKE_RESETVAL (0x00)
//#定义EMIFA_READ_HOT_RESETVAL (0x00)
//#定义EMIFA_TA_RESETVAL (0x00)


内部主(无效)

PSCModuleControl (SOC_PSC_1_regs,HW_PSC_GPIO,
PSC_POWERDOMAIN_ALUSE_ON,
PSC_MDCTL_NEXT启用);

HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (0)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (1))= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (2)= 0x4444.4444万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (3)= 0x4444.4444万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (4)= 0x8888.8844万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (5)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (6)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (7)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (8)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (9)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (10)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (11))= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (12)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (13)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (14))= 0x0.0088万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (16)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (17)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (18)= 0x8888.8888万;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (19)= 0x8888.8888万;

无符号int i =0;
对于(i = 0;I<= 144;I++){
GPIODIRModeSet (SOC_GPIO _0_regs,I,GPIO _DIR_INPUT);
}

int *数据;
数据=(int *)malloc(sizeof(int)*250万);
无符号int x =0;
用于(x = 0;x<= 250万;x++){
Data[x]=HWREG (SOC_GPIO _0_regs + GPIO _IN_DATA (2));
}
printf("%d\n",sizeof(data/sizeof(datel[0]);
}

我对代码编写器和开发套件相当陌生,所以我可能犯了一个愚蠢的错误。

如果有任何帮助,我们将不胜感激!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我忘了在我的帖子中提到,昨天这个代码似乎工作正常,但今天开始出现这个错误。 我不确定我昨天是做了一些修复错误的事情,还是今天做了一些事情来导致错误。 我对此感到非常困惑。 我使用的是实际数组而不是malloc函数,但根据我的理解,malloc只能起到帮助作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [QUOTE USER="Pierce J">I使用的是实际数组而不是malloc函数,但根据我的理解,malloc只能起到帮助作用。如果堆大小不足,malloc()将返回空指针,这可能导致程序覆盖内存中的其他内容。

    从发布的代码中,堆大小需要大于1000万 字节。

    堆大小可以从“项目属性”->“生成”->“C6000链接器”->“基本选项”->“C/C++动态内存分配的堆大小”(--heap_size,-heap)中设置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢Chester的回复。

    我昨天更深入地研究了这个问题。 程序分配所有数据似乎没有问题,但在底部的printf语句运行时会创建此错误。 如果我理解正确,我认为printf函数是内存映射的.cio部分的一部分。 我尝试将此部分映射到更大的内存区域。 执行此操作会导致以下错误:

    [C674x_0]无法识别位于地址(0xD900.0148万)的CIO缓冲区中无效的CIO命令(0)。 请检查设备和程序存储器映射。

    下面是我的记忆图的图片:

    内存

    DSPL2ROM O S = 70万 l = 0x10万 /* 1 MB L2内置ROM */
    DSPL2RAM o SRA2= 80万 l = 0x4万 /* 256KB L2内置RAM */
    DSPL1PRAM o = 0x00E 0万 l = 0x0.8万 /* 32kB L1内部程序RAM */
    DSPL1DRAM o = 0x00F 0万 l = 0x0.8万 /* 32kB L1内部数据RAM */
    SHDSPL2ROM o = 1170万 l = 0x10万 /* 1 MB L2共享内部ROM */
    SHDSPL2RAM o = 1180万 l = 0x4万 /* 256KB L2共享内置RAM */
    SHDSPL1PRAM o = 0x11E 0万 l = 0x0.8万 /* 32kB L1共享内部程序RAM */
    SHDSPL1DRAM o = 0x11F 0万 l = 0x0.8万 /* 32kB L1共享内部数据RAM */
    EMIFACS0 o SRAM= 4000万 l = 0x2000万 /* 512 MB SDRAM数据(CS0)*/
    EMIFACS2 o 40C= 6000万 l = 0x200万 /* 32 MB 异步数据(CS2)*/
    EMIFACS3 o 404= 6200万 l = 0x200万 /* 32 MB 异步数据(CS3)*/
    EMIFAC4 o 404= 6400万 l = 0x200万 /* 32 MB 异步数据(CS4)*/
    EMIFACS5 o 40C= 6600万 l = 0x200万 /* 32 MB 异步数据(CS5)*/
    SHRAM o R4b = 8000万 l = 0x20万 /* 128KB共享RAM */
    DDR2 O = 0xC 0万 l = 0x2000万 /* 512 MB DDR2数据*/
    }

    章节

    文本 > SHRAM
    堆栈 > SHRAM
    BSS > SHRAM
    首席信息官 > DDR2
    。const > SHRAM
    数据 > SHRAM
    开关 > SHRAM
    sysmem > DDR2
    远 > DDR2
    .args > SHRAM
    .pppinfo > SHRAM
    .pppdata > SHRAM

    /* COFF部分*/
    。销钉 > SHRAM
    cinit > SHRAM

    /* EABI部分*/
    二进制 > SHRAM
    init_array > shram
    .neardata > SHRAM
    fardata > SHRAM
    .rodata > SHRAM
    .c6xabi.exidx > shram
    .c6xabi.extab > SHRAM
    }

    再次强调,我对董事会很陌生,所以我可能犯了一个愚蠢的错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请阅读文章 使用printf的提示中的建议,其中一些建议已在本主题中提及。  我意识到这需要一段时间,对此我感到遗憾。  但我认为这是目前最好的前进道路。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢George的链接!

    实际上,我可以通过将.far部分放回SHRAM并确保我的堆足够大,以便malloc函数将所有数据分配到其中来解决这个问题。 我没有足够的知识来确切地知道这是为什么修复它的。 在 本文www.ti.com/.../spru187o.pdf中,全局变量和静态变量似乎放在.far部分中。 因为我在DDR2中有.far,那是外部内存,所以printf语句可能试图访问DDR2中保存的内容,但无法访问它?? 不管怎样,我想我现在至少已经解决了这个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    printf无法"到达"的唯一可能方式是存在重新定位溢出,该溢出将在链接时显示为警告。 您是否从链接器收到任何警告或错误消息?

    我很高兴您能使该计划正常运行。 仅就记录而言,您在链接程序命令文件中分配了多少堆和堆栈? 即--heap和--stack命令行选项的值是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    链接器没有提供任何错误或警告。 仅针对printf语句的上述错误。

    我的堆大小为0x100万,堆栈大小为0x1万