硬汉嵌入式论坛

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

[ThreadX全家桶] 讨论一下GUIX可否裸机的问题!

[复制链接]

10

主题

100

回帖

130

积分

初级会员

积分
130
发表于 2022-9-25 13:02:29 | 显示全部楼层 |阅读模式
    昨天仔细研究了一些GUIX 裸机的可行性,结论就是:不行,当然了也不是完全不行,除非你把GUIX 的动画部分重构。否则,好像是不能裸机的,我说一下我的分析的原因,供大家探讨。
1、GUIX关闭ThreadX,支持其他的,是定义预编译“GX_DISABLE_THREADX_BINDING”。而且官方好像支持UCOS_II和UCOS_III。只需要定义GUIX_BINDING_UCOS_II或者GUIX_BINDING_UCOS_III。自己看一下gx_system_rtos_bind.h和gx_system_rtos_bind.c里面的代码就可以啦,开源就这点好
2、既然是裸机,就需要自己实现相应的接口,需要实现的接口如下:
VOID  gx_generic_rtos_initialize(VOID);
UINT  gx_generic_thread_start(VOID (*thread_entry)(ULONG));
UINT  gx_generic_event_post(GX_EVENT *event_ptr);
UINT  gx_generic_event_fold(GX_EVENT *event_ptr);
VOID  gx_generic_event_purge(GX_WIDGET *widget);
UINT  gx_generic_event_pop(GX_EVENT *put_event, GX_BOOL wait);
VOID  gx_generic_timer_start(VOID);
VOID  gx_generic_timer_stop(VOID);
VOID  gx_generic_system_mutex_lock(VOID);
VOID  gx_generic_system_mutex_unlock(VOID);
ULONG gx_generic_system_time_get(VOID);
VOID *gx_generic_thread_identify(VOID);
VOID  gx_generic_time_delay(INT ticks);


逐个分析:
gx_generic_rtos_initialize()-->初始化函数,被guix调用,因为要实现队列,所以里面放需要初始化一些变量之类的
gx_generic_thread_start-->这个就是需要定期调用的API,但是不是调用这个,本身此API也是被guix调用,但是会传递出一个任务函数指针,我们需要定期调用此任务指针,就可以完成guix内部的任务。大致上是这样,具体我看了半天,有点迷糊,但是不管怎么样,周期性调用任务是和这个api相关
UINT  gx_generic_event_post(GX_EVENT *event_ptr);
UINT  gx_generic_event_fold(GX_EVENT *event_ptr);
VOID  gx_generic_event_purge(GX_WIDGET *widget);
UINT  gx_generic_event_pop(GX_EVENT *put_event, GX_BOOL wait);
-->上面4个,是一个事件FIFO,本质上是一个队列。也好实现,而且guix的任务函数里面就是扫描的是否有事件
以上都是可以用裸机实现的,真正不能实现的是,下面几个函数,最主要的是gx_generic_timer_stop和gx_generic_time_delay。虽然gx_generic_timer_start也是和OS相关,但是在裸机里面是可以实现的
gx_generic_timer_start-->唤醒,这个裸机里面就是要开始运行任务,勉强可以实现。
gx_generic_timer_stopgx_generic_time_delay-->一个是挂起,一个是延时。
-->我只是仔细看了一下gx_generic_timer_stop在guix那些地方被运行,gx_generic_time_delay没有没有研究,因为研究gx_generic_timer_stop的时候,就已经知道不可能裸机了。
gx_generic_timer_stop-->是挂起,表示OS会在这个地方调度。那么下次调度回来的时候,需要从挂起的地方运行。这就是问题来了,裸机实现不了这个,而且,好像挂起都是运行动画时候,起到的作用。
gx_generic_time_delay-->延时,本质上和上面挂起差不多,这个估计会被调用的地方更多。



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-9-25 14:00:26 | 显示全部楼层
后面我做个裸机试试
回复

使用道具 举报

10

主题

100

回帖

130

积分

初级会员

积分
130
 楼主| 发表于 2022-9-25 14:34:00 | 显示全部楼层
eric2013 发表于 2022-9-25 14:00
后面我做个裸机试试

可能要改动很大,才可以裸机,主要是gx_generic_timer_stop和gx_generic_time_delay这两个函数,不太好实现。。。需要改guix内部的函数。。。
回复

使用道具 举报

85

主题

782

回帖

1037

积分

至尊会员

积分
1037
发表于 2022-9-25 16:34:20 | 显示全部楼层
以前也想搞裸机下跑,但是后面发现都上界面库了,也不差系统的那点开销了,所以感觉没太大必要。
回复

使用道具 举报

10

主题

100

回帖

130

积分

初级会员

积分
130
 楼主| 发表于 2022-9-25 16:40:32 | 显示全部楼层
庄永 发表于 2022-9-25 16:34
以前也想搞裸机下跑,但是后面发现都上界面库了,也不差系统的那点开销了,所以感觉没太大必要。

主要是有些项目用的MCU是很稀少的内核。。。移植汇编有点麻烦!!!
回复

使用道具 举报

10

主题

100

回帖

130

积分

初级会员

积分
130
 楼主| 发表于 2022-9-25 16:42:02 | 显示全部楼层
主要是有些内核不是常见的,ThreadX移植有点麻烦!!!
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
发表于 2022-11-15 20:27:35 | 显示全部楼层
mrjiu 发表于 2022-9-25 16:40
主要是有些项目用的MCU是很稀少的内核。。。移植汇编有点麻烦!!!

说明项目选型方向有问题
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-24 07:19 , Processed in 0.247773 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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