硬汉嵌入式论坛

 找回密码
 立即注册
查看: 336|回复: 3
收起左侧

[ThreadX全家桶] 新的GUIX,GX_STRING数据结构的初始化问题。

[复制链接]

6

主题

16

回帖

34

积分

新手上路

积分
34
QQ
发表于 2024-1-2 20:35:09 | 显示全部楼层 |阅读模式

参考安富莱V7-2015_GUIX Timer Update

因为我移植的GUIX是最新版本。

手册.png
手册上说gx_prompt_text_set这个函数已经弃用(其实还是可以用,但是我还是希望使用官方推荐的方法),需要使用GX_STRING这个数据结构
手册1.png

所以将页面的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操作前,它的空间指针被赋值了,而且每次都不一样,应该是按堆栈空间给的。
不理解,这个现象很奇怪。有没有大佬知道为啥?


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106753
QQ
发表于 2024-1-3 08:40:03 | 显示全部楼层
你看下你那边是不是这个问题

GUIX  sample 错误-->gx_prompt_text_set_ext大坑,必须正确指定有效字符串长度才可以使用
https://www.armbbs.cn/forum.php? ... 2646&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

6

主题

16

回帖

34

积分

新手上路

积分
34
QQ
 楼主| 发表于 2024-1-8 20:09:06 | 显示全部楼层
更新一下后续
我后面又建了一个页面,同样是在GX_EVENT_SHOW事件中开启定时器,定时器超时回调中设置文本框。
这时用到GX_STRING buf;,地址空间就没有初始值了。
我猜测应该是内存回收机制的问题,之前有初始值是因为作为局部变量申请内存时,这片内存没有初始化(存疑,应该不会这样才对)。
反正用到GX_STRING 这个标准字符串结构是必须绑定gx_string_ptr这个内存空间,也必须将gx_string_length这个长度及时更新成正确的字符串长度才行。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106753
QQ
发表于 2024-1-9 09:16:44 | 显示全部楼层
yono 发表于 2024-1-8 20:09
更新一下后续
我后面又建了一个页面,同样是在GX_EVENT_SHOW事件中开启定时器,定时器超时回调中设置文本 ...

他这个实现就是有这种问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 09:57 , Processed in 0.217805 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表