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.

[参考译文] TMDX570LC43HDK:sprintf 函数会触发 DataEntry 中断矢量

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1513010/tmdx570lc43hdk-the-sprintf-function-triggers-the-dataentry-interrupt-vector

部件号:TMDX570LC43HDK
主题中讨论的其他器件:HALCOGEN

工具/软件:

您好!

我正在尝试实现一个 使用 sprintf()函数将数据打印到字符的代码。 当使用格式化输入(即:"...%u...")时、代码的执行将停止运行。 如果代码在此空闲阶段暂停、则 hl_sys_intvecs.asm 会在以下行打开:

b   dataEntry

进行分步调试时、我注意到在尝试执行赋值时、在_printfi.c 文件中的_pproc_fwp ()函数内触发了中断  

*tmpptr = '\0';
(我的案例中为第559行)。

我怀疑这可能与我 在 hl_sys_link.cmd 文件中配置存储器段的方式有关、因为我对我所做的事情没有信心:

/*                                                                            */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN (0) */
/* USER CODE END */
/*----------------------------------------------------------------------------*/
/* Linker Settings                                                            */

--retain="*(.intvecs)"

/* USER CODE BEGIN (1) */
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Memory Map                                                                 */

MEMORY
{
    VECTORS (X)  : origin=0x00000000 length=0x00000020
    KERNEL  (RX) : origin=0x00000020 length=0x00008000 
    FLASH0  (RX) : origin=0x00008020 length=0x001F7FE0
    FLASH1  (RX) : origin=0x00200000 length=0x00200000
    STACKS  (RW) : origin=0x08000000 length=0x00000800
    KRAM    (RW) : origin=0x08000800 length=0x00000800
    RAM     (RW) : origin=(0x08000800+0x00000800) length=(0x0007f800 - 0x00000800)
    
/* USER CODE BEGIN (2) */
/* USER CODE END */
}

/* USER CODE BEGIN (3) */
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Section Configuration                                                      */

SECTIONS
{
    .intvecs : {} > VECTORS
    /* FreeRTOS Kernel in protected region of Flash */
    .kernelTEXT  align(32) : {} > KERNEL
    .cinit       align(32) : {} > KERNEL
    .pinit       align(32) : {} > KERNEL
    /* Rest of code to user mode flash region */
    .text        align(32) : {} > FLASH0 | FLASH1
    .const       align(32) : {} > FLASH0 | FLASH1
    /* FreeRTOS Kernel data in protected region of RAM */
    .kernelBSS    : {} > KRAM
    .kernelHEAP   : {} > RAM
    .bss          : {} > RAM
    .data         : {} > RAM    

/* USER CODE BEGIN (4) */
	.sysmem                : {} > RAM
	.freertosStaticStack   : {} > RAM
	.noinit                : {} > RAM
/* USER CODE END */
}

/* USER CODE BEGIN (5) */
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Misc                                                                       */

/* USER CODE BEGIN (6) */
/* USER CODE END */

/*----------------------------------------------------------------------------*/
 

我正在运行的代码是一个简单的 sprint 示例:

uint8_t i = 2;
char buffer[50];
int a = 10, b = 20, c;
c = a + b;
sprintf(buffer, "Sum of %d and %d is %d", a, b, c);

提前感谢您!

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

    您好、

    我对您的代码没有任何问题。

    以下是我的测试项目:

    e2e.ti.com/.../Customer_5F00_Issue_5F00_Sprintf_5F00_test_5F00_LC4357.zip

    请参阅上面随附的工程一次、如果它无法解决您的问题、请在我这边共享您的工程以调试问题

    --
    此致、
    Jagadish。

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

    您好! 感谢您的回复!

    我意识到每次使用 sprintf()函数时都不会出现错误。 在我的工程中、我使用 SCI 驱动程序打印到终端、而这就是它失败的地方。

    有趣的是、在您的项目上运行相同的 main (在 HALCoGen 中添加 SCI 驱动程序)似乎是有效的(尽管打印的值是错误的、但这是我将来会担心的)。

    下面是我的项目:

    e2e.ti.com/.../sprintf_5F00_test.zip

    以下是工程的修改版本:

    e2e.ti.com/.../2671.Customer_5F00_Issue_5F00_Sprintf_5F00_test_5F00_LC4357.zip

    谢谢。此致、

    Enrique

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

    尊敬的  Enrique:

    由于其他优先级问题、我没有时间调试该问题。

    平均时间我建议您参考以下常见问题解答、以排除不同的例外情况:

    (+)[常见问题解答] TMS570LC4357:Hercules 器件上的中止异常疑难解答-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --
    此致、
    Jagadish。

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

    南...

    我设法解决了这个问题。

    这与将 bufferTX 变量声明为静态(并将其所有值设置为0)一样简单。 如果您不这样做,分配给缓冲区的内存会被覆盖,最终导致程序尝试写入空指针,从而触发数据异常(我相信,但我仍然不太确定)。 我必须承认、我仍然不能完全理解该微控制器如何使用存储器、但我想我会逐步弄清楚。

    关于另一个问题(我得到的 gibberish 而不是传递给 sprintf 函数的预期值),我只是愚蠢的,真的没有研究 va_list 变量和 printf 系列函数的交互作用。 通过将 sprintf 更改为 vsprintf 可以解决此问题。 我认为它属于程序设计的小 bug 部分,但由于我在另一条评论中提到它,我认为  这是值得解释的解决方案。

    导致 ME 问题的函数的最终(和功能)代码是:

    void print_func(const char * fmt, ...) {
    
        va_list args;
    
        static char bufferTX[255];
    
        memset(bufferTX, 0, 255);
    
        va_start(args, fmt);
        vsprintf(bufferTX, fmt, args);
        va_end(args);
    
        sciDisplayText(sciREG1, (uint8_t *) &bufferTX, 255);
    }

    那,谢谢你 Jagasidh 你的帮助和评论!