工具/软件:Code Composer Studio
曾使用CCS 7.1 ARM 0.0.0016万 v 16.9 .2.LTS编译器为EK-TM4C129EXL创建程序。 如果检测到错误,程序将使用RTS assert.h文件中的Assert宏中止程序。
发现当启用“将时间戳信息添加到目标输出”时,发生断言失败后,CIO控制台被填充了虚假文本,并且程序没有在loader_exit()处停止。
以下代码说明了该问题:
/*
* main.c
*/
#include <stdio.h>
#include <assee.h>
int main(void)
{
易失性int A =2;
易失性int b=3;
printf ("下一个断言应通过\n");
断言(a != b);
printf ("下一个断言应失败\n");
断言(a == b);
printf ("由于以前的断言中止了程序,所以不应显示此行\n");
返回0;}
如果在未启用“将时间戳信息添加到目标输出”时运行程序,程序将按预期运行,因为声明失败在CCS CIO控制台中报告,并且在程序因声明失败而中止后,程序在loader_exit()中停止:
如果在启用“Add timestamp information to target output”(将时间戳信息添加到目标输出)的情况下运行程序,CIO控制台将显示预期的断言失败消息(第一行为红色),但程序不会中止,而是继续运行,并且在CIO控制台中显示虚假文本:
在单步故障情况下,代码进入fputs RTS函数,将声明失败文本消息写入CCS调试器。 当执行以下行时:
int write_return = write (_fp->fd,_ptr + num_written,num_left);
num_left,要写入的字符数为52
write_return,报告为写入的字符数为74。
问题是write()函数返回的字符数为74个,比要求写入的字符数多22个。 这会导致fputs()函数中的循环,该函数设计用于处理部分写入,以计算仍有大量未签名的字符(4294967274)要写入,从而开始在输入字符串的末尾写入虚假文本。
如果WRITE函数返回的字符比实际写入的字符多22个, CCS调试器添加到目标输出的时间戳是22个字符,我认为问题是CCS CIO处理标准错误时错误地将插入的时间戳计入返回到目标的字符数中。

