各位大侠您们好 有个新问题请教,我要是用 sprintf显示字符,为什么%d,%s都可以,而%f一直都是0.000000? 后来发现是调用stemwin里的GUI_TOUCH_Exec()函数有冲突,当不调用GUI_TOUCH_Exec()函数时,sprintf函数的使用就正常,如果一调用,就会出现上面的问题,还有大侠指教下啊?谢谢 for( ; ; ) { GUI_TOUCH_Exec(); GUI_Exec(); GUI_Delay(10); } |
TOUCHGFX中别人封装好的控件容器可以直接使用吗?
STM32MP135移植lvgl build fatal error: drm.h: No such file or directory
H750 + TouchGFX分散加载KEIL5报错 Error: L6216E
我用TouchGFX生成的代码在keil中编译报错,我该如何解决?
使用STM32CubeMX配置LTDC,LTDC时钟信号没有出来
STM32MP135 LTDC硬件设计
STM32CUBE吗配置LTDC,RGB565怎么配置不用R7和B7最高位
使用STM32H750XB加TouchGFX4.22.0开发UI,从主屏幕切换到副屏后,单片机会卡死
求教STM32H750VBT6 可以同时使用SDRAM,LDTC以及外挂QSPI FLASH吗?
stm32f746-disco需要添加外置FLASH
https://www.stmcu.org.cn/module/forum/thread-612727-1-1.html
增加栈和堆。
评分
查看全部评分
我试了下,还是不行,真是奇了怪了
Stack_Size EQU 0x00000400
Heap_Size EQU 0x00000200
我给改成
Stack_Size EQU 0x00001000
Heap_Size EQU 0x00000800
扩大了4倍,还是不行啊
char testc[100];
Msg_Size=sprintf(testc,"Any your message %d\n\r",i);
if (Msg_Size>100)
{
printf(P_msg1);
}
给你个思路,以上代码仅是示例,看懂意思自己实现,每次sprintf会返回实际打印字符数,你在每个打印语句后都用这个返回值与你实际申请的空间做一次越界判断。
------------------------------------
如果你调整堆栈尺寸不能解决问题,说明不是多层次调用后溢出引起的,你需要先排除sprintf的打印溢出潜在错误。
评分
查看全部评分
另外它不检查是否打印超过了你申请空间的尺寸。
----------------------------------------------------------
以上两个问题,如果是现在的GCC编译器是可以帮你检查出来的,但是keil的编译器,起码现在5.0的是不会帮你检查出来的。目前keil 5.24版本里有了6.7版编译器,可惜CubeMX生成的工程不支持,坐等ST啥时候发福利。
e:\q.png
谢谢你的指点,我按照你说的方法试了,显示没有超出我设置12的长度,真是邪门了
float temp;
int msize;
for(i=0; i<nCH; i++)
{
LISTVIEW_SetItemText(hDlgListView, 1, i, TRAINSTATUS[StateUn.Current.CH_Para[i].TrainState]);
//temp = StateUn.Current.CH_Para[i].TrainDura/1000.0;
//temp =1000.0;
msize = sprintf(bStr, "%.3f", 1000.0);
if(msize < 12)
LISTVIEW_SetItemText(hDlgListView, 2, i, bStr);
else
LISTVIEW_SetItemText(hDlgListView, 2, i, "Error");
靠,图片怎么显示不出来? 运行后msize = 5, 显示0.000
还有个关键,为什么不调用GUI_TOUCH_Exec(); 就是好的,而一调用就不对?缓冲区,堆栈我都加大了,把sprintf的第一个参数的长度定义为256,%.3f 改为%7.3f还是不行
1. 给函数声明 __attribute__
比如声明函数:
void task(void) __attribute((section(".ARM.__at_0x8100000")));
这样函数 task 会被连接到 0x8100000 地址处.
不同的函数可以使用同一个地址,链接的时候会自动处理.
每个函数都需要声明一次.
2. 使用#pagaram 控制
如下定义:
#pragma arm section code=".ARM.__at_0x8100000"
void task(void)
{
}
#pragma arm section
这样函数 task 会被链接到 0x8100000 地址.
这样做的优点是声明区内的函数都会包含在指定的地址范围内.
-------------------------------------------------------------------------------
把你的GUI_TOUCH_Exec()函数独立指定链接地址,你可以先看一下你编译后代码尺寸,然后把这个函数放在你总尺寸以后,如果你这个函数立即又调用别的函数,这个方法就不好使了。
与你怀疑有问题的大块内存变量,可以用类似:TempBuf [1024] __attribute__((at(0X20002000)))
指定内存分配地址。
这样可以把问题函数,变量孤立出来,可以排除编译链接问题。
楼主上传方法不对吧,看这里
https://www.stmcu.org.cn/module/forum/thread-612788-1-1.html