|
参考安富莱V7-2015_GUIX Timer Update
因为我移植的GUIX是最新版本。
手册上说gx_prompt_text_set这个函数已经弃用(其实还是可以用,但是我还是希望使用官方推荐的方法),需要使用GX_STRING这个数据结构
所以将页面的event回调函数中的gx_prompt_text_set改成了gx_prompt_text_set_ext
UINT _EventFW0(GX_WINDOW* widget, GX_EVENT* event_ptr)
{
static uint32_t count = 0;
GX_STRING buf;
switch(event_ptr->gx_event_type)
{
/* 控件显示事件 */
case GX_EVENT_SHOW:
/* 启动一个GUIX定时器 */
gx_system_timer_start((GX_WIDGET*) widget, GUI_ID_Timer0, 1, 50);
/* 默认事件处理 */
gx_window_event_process(widget, event_ptr);
break;
/* 定时器时间溢出事件*/
case GX_EVENT_TIMER:
if(event_ptr->gx_event_payload.gx_event_timer_id == GUI_ID_Timer0)
{
buf.gx_string_length = LIB_NumToAscii(count, 0, 0, (uint8_t*) buf.gx_string_ptr);
count++;
gx_prompt_text_set_ext((GX_PROMPT*) &(window.window_prompt), &buf);
}
break;
default:
return gx_window_event_process(widget, event_ptr);
}
return 0;
}
注意到GX_STRING这个数据结构
/* Define the String type. */
typedef struct GX_STRING_STRUCT
{
GX_CONST GX_CHAR *gx_string_ptr; /* Pointer to string. */
UINT gx_string_length; /* String length in bytes. */
} GX_STRING;
这个结构中的*gx_string_ptr是指针,待绑定的。在我的代码中是没有对这个指针进行绑定的
但是在代码中运行的时候,它会被分配到一个0x24xxx的指针,很奇怪。所以这个代码修改成gx_prompt_text_set_ext之后可以正常运行
但是啊!但是!
后面我又创建了一个prompt在GUI中
while(1)
{
TOUCH_Scan( ); /* 电阻触摸屏和计数 */
TOUCH_CapScan( ); /* 电容触摸屏 */
dFlag[0]++;
if(dFlag[0 > 500)
{
GuixDebug( );
dFlag[0 = 0;
}
tx_thread_sleep(1);
}
}
void GuixDebug(void)
{
static uint32_t count = 0;
GX_STRING buf;
//char str[10];
//buf.gx_string_ptr = str;
count++;
buf.gx_string_length = LIB_NumToAscii(count, 0, 0, (uint8_t*) buf.gx_string_ptr);
gx_prompt_text_set_ext(&(window.window_prompt_1), &buf);
}
我有这样的代码定时给另一个文本框prompt_1赋字符串,与回调函数中的操作一致。
这个时候buf的*gx_string_ptr却是0x0000000,它并没有被分配到地址空间,实际运行效果就是,那个使用定时器更新的文本框在不断刷新,这个使用任务更新的文本框没有反应。
需要使用我注释掉的这个代码注册地址空间,然后这个任务更新的文本框恢复正常。
看这个结构,理论上更新文本框使用的GX_STRING 结构体,应该是要手动注册文本空间和文本长度的,这个在官方手册的例程中也有体现。
但是为什么在事件回调函数中它却被自动注册了呢?单步调试发现,进回调函数的时候,这个空间指针还是0x0000000,但是在第一步switch操作前,它的空间指针被赋值了,而且每次都不一样,应该是按堆栈空间给的。
不理解,这个现象很奇怪。有没有大佬知道为啥?
|
|