打印

又一种协作式多任务实现方式

[复制链接]
3951|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ev, ST, se, tv, TVS
本帖最后由 Simon21ic 于 2015-11-8 21:35 编辑

之前自己介绍的系统构架中,vsfsm_t实现了事件驱动的状态机构架,但是纯粹的事件驱动开发方式很麻烦。
于是,引入的PT的方式,实现线程。PT是一种共享堆栈的线程,每次被调用,需要重建对战,而且,之前堆栈里的变量不被保留。这个就是这套系统构架开发难度较高的一个原因。

现在准备引入一种新的多任务机制,这种方式类似RTOS,每个任务需要自己的独立堆栈,任务使用上下文切换的方式来切换。当然,我还是把这个使用面向对象的方式封装了一下,并且还是基于vsfsm_t的事件驱动构架。

这种方式就是利用C语言的setjmp和longjmp来实现的多任务。

上代码:static struct vsfsm_state_t *
vsfsm_ljmp_evt_handler(struct vsfsm_t *sm, vsfsm_evt_t evt)
{
        struct vsfsm_ljmp_t *ljmp = (struct vsfsm_ljmp_t *)sm->user_data;
        jmp_buf ret;

        if ((evt == VSFSM_EVT_ENTER) || (evt == VSFSM_EVT_EXIT))
        {
                return NULL;
        }

        memset(&ret, 0, sizeof(ret));
        ljmp->ret = &ret;
        if (!setjmp(ret))
        {
                if (evt == VSFSM_EVT_INIT)
                {                        core_interfaces.core.set_stack((uint32_t)ljmp->stack);
                        ljmp->thread(ljmp);
                }
                else
                {
                        longjmp(ljmp->pos, evt);
                }
        }
        return NULL;
}


vsf_err_t vsfsm_ljmp_init(struct vsfsm_t *sm, struct vsfsm_ljmp_t *ljmp)
{
        sm->user_data = ljmp;
        sm->init_state.evt_handler = vsfsm_ljmp_evt_handler;
        ljmp->sm = sm;
        return vsfsm_init(sm);
}

这个代码只是示例代码,还不是最终的实现代码。

和vsfsm_pt_evt_handler类似,vsfsm_ljmp_evt_handler是处理ljmp的事件处理函数。
这里就只是在INIT事件中,调用thread,然后其他事件里,直接longjmp跳转到对应任务的记录点。


longjmp的方式,可以简单认为是一个可以跨任务的超级goto。
当然,ljmp->thread的实现也会有一些讲究,任务如果运行到等待某个事件的时候,也需要longjmp回evt_handler。

然后,ljmp的wfe宏定义如下:
#define vsfsm_ljmp_wfe(ljmp, e)                \
        do {\
                vsfsm_evt_t __evt = setjmp((ljmp)->pos);\
                if (!__evt || (__evt != (e)))\
                        longjmp(*(ljmp)->ret, 0);\
        } while (0)

测试的应用代码:
void ljmp_test_thread(struct vsfsm_ljmp_t *ljmp)
{
        if (vsftimer_create(ljmp->sm, 100, -1, VSFSM_EVT_USER) != NULL)
        {
                while (1)
                {
                        vsfsm_ljmp_wfe(ljmp, VSFSM_EVT_USER);
                        asm("nop");
                }
        }
}


说明:
未完待续。。。先看看有多少人可以自己看懂。
另外,vsfsm_ljmp_evt_handler里的代码有潜在性的问题,看看谁能看出来。

相关帖子

沙发
Simon21ic|  楼主 | 2015-11-15 14:11 | 只看该作者
yyy71cj 发表于 2015-11-15 10:37
有几个人说我的书写的太浅显,解释太多。
但是他们都会表达出看懂了我的意思。
你的东西看起来很高大上, ...

我做的东西,本身就不针对能力不足的人,不是为了让所有人都能够用起来的
说实话,按照之前给别人做培训的经验,7-10个人里,只有一个能够比较顺利掌握以及可以应用开发的
我们大部分的讨论也都只是在自己的群里讨论,只是偶尔发布一些,看看别人的反应而已
当然,不管别人怎么反应,都不会影响我们自己玩自己的平台
我之前说过了,我们的东西,不推荐别人取学习
只是一些有意思的实现方法,我拿出来分享一下而已

使用特权

评论回复
板凳
Simon21ic|  楼主 | 2015-11-15 14:20 | 只看该作者
本帖最后由 Simon21ic 于 2015-11-15 14:25 编辑

不过,确实,我在培训的时候,关于A和B也只会简单的点一下,完全不会扩展开来讲。
对于大部分人来说,看不懂是正常的,而且,根本就不用看,这个只是我们自己的定制系统使用的方法而已。

对于少数一些能够看懂的人来说,如果可以开阔一下思路,没什么不好。不过,我仍旧不建议使用我们的系统。
当然,即使没有其他人能够看懂,也无所谓,不妨碍我们自己玩
有一点比较好奇的,不知道多少人看了这个帖子后,去搜索一下setjmp库的

使用特权

评论回复
地板
Simon21ic|  楼主 | 2015-11-15 20:28 | 只看该作者
yyy71cj 发表于 2015-11-15 19:28
如果是我,我是不会搜的,因为一看这个名字就知道,不具备普遍性,搜出的也极有可能是文不对 ...

这个只是大部分人都不知道而已,确实是标准的C语言库,具备普遍性的

使用特权

评论回复
5
我想想| | 2015-11-15 21:13 | 只看该作者
mark一下   回去编程了 - -

使用特权

评论回复
6
Simon21ic|  楼主 | 2015-11-15 21:49 | 只看该作者
yyy71cj 发表于 2015-11-15 20:46
哦,还有这事,我倒是从来就没用过。那你就展开讨论一下看呢?也许这更吸引人…… ...

呵呵,貌似我发的帖子,很少展开讨论,点到为止就行了
这个一般也只是用于异常处理,很多linux程序都用到的
只是,知道原理的话,可以自己扩展用于其他方面而已

使用特权

评论回复
7
keer_zu| | 2015-11-16 08:43 | 只看该作者
yyy71cj 发表于 2015-11-16 07:39
这就说明,你只是个工程师,而不是个教师。
C语言是一门极为抽象的符号语言,虽然好识,却极 ...

java没人感兴趣吗?

使用特权

评论回复
8
keer_zu| | 2015-11-16 08:48 | 只看该作者
yyy71cj 发表于 2015-11-16 08:47
若用得上,就有兴趣,若用不上,就没兴趣。java用过,但是没任何感觉,现在就不用了 ...

也是,若不是最近这个事情必须,否则也不会用起来,不过之前倒是很感兴趣。

使用特权

评论回复
9
Simon21ic|  楼主 | 2015-11-16 12:57 | 只看该作者
yyy71cj 发表于 2015-11-16 07:39
这就说明,你只是个工程师,而不是个教师。
C语言是一门极为抽象的符号语言,虽然好识,却极 ...

做教师的话,估计我的工资直接下降一半,别人也不会愿意给我提成。。。。

问题是否简单,有时候也和应用有关的
我们自己做tcpip协议栈,碰到过的问题和引发的原因完全不沾边,都是通过一步一步调试,逐步发现问题的,这个靠知觉解决不了

使用特权

评论回复
10
keer_zu| | 2015-11-16 14:06 | 只看该作者
Simon21ic 发表于 2015-11-16 12:57
做教师的话,估计我的工资直接下降一半,别人也不会愿意给我提成。。。。

问题是否简单,有时候也和应用 ...

目前在哪个城市?

使用特权

评论回复
11
Simon21ic|  楼主 | 2015-11-16 16:57 | 只看该作者
keer_zu 发表于 2015-11-16 14:06
目前在哪个城市?

上海

使用特权

评论回复
12
keer_zu| | 2015-11-16 17:45 | 只看该作者

上海哪里?

使用特权

评论回复
13
keer_zu| | 2015-11-16 17:46 | 只看该作者
yyy71cj 发表于 2015-11-16 17:44
每一个东西在刚出现的时候,都会被一群人追捧一阵,然后这个东西就红了。曾经的can总线就是这样,C语言也 ...

JAVA早就过了所谓的流行期了。

使用特权

评论回复
14
Simon21ic|  楼主 | 2015-11-16 21:18 | 只看该作者
keer_zu 发表于 2015-11-16 17:46
JAVA早就过了所谓的流行期了。

google给java第二次生命了

使用特权

评论回复
15
Simon21ic|  楼主 | 2015-11-16 21:19 | 只看该作者

呃呃呃,上海的家里,我不上班,只是帮别人开发东西

使用特权

评论回复
16
keer_zu| | 2015-11-17 08:19 | 只看该作者
Simon21ic 发表于 2015-11-16 21:19
呃呃呃,上海的家里,我不上班,只是帮别人开发东西

不错,总觉得上班就是为别人做嫁衣,哈哈

使用特权

评论回复
17
keer_zu| | 2015-11-17 08:20 | 只看该作者
yyy71cj 发表于 2015-11-17 07:13
嗯,那应该是人家的宣传期结束了。
从这可以看出,有些人很盲从,容易被鼓动而充当人家的走卒 ...

java能成为当下排名第一编程语言还是有它的道理的,不是宣传到位就能做到的。

使用特权

评论回复
18
keer_zu| | 2015-11-17 08:38 | 只看该作者
yyy71cj 发表于 2015-11-17 08:24
排名第一???
又来搞个排名?你是说要把电脑与手机、单片机放一起混排么?
中国有句话说得 ...

http://digi.163.com/15/1109/22/B80U542L00162OUT.html

这个可是每月发布的,权威机构,不是国内专家叫兽搞的。

使用特权

评论回复
19
keer_zu| | 2015-11-17 08:39 | 只看该作者
yyy71cj 发表于 2015-11-17 08:24
排名第一???
又来搞个排名?你是说要把电脑与手机、单片机放一起混排么?
中国有句话说得 ...

TIOBE 编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如 Google、MSN、Yahoo!、Wikipedia、YouTube 以及 Baidu 等)进行计算。请注意这个排行榜只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。

这个排行榜可以用来考查你的编程技能是否与时俱进,也可以在开发新系统时作为一个语言选择依据。以上是php-z译文,排行榜的详细定义可以参考这里( 英文)。

使用特权

评论回复
20
keer_zu| | 2015-11-17 19:23 | 只看该作者
yyy71cj 发表于 2015-11-17 15:38
嗯,看来这具有相当的客观度,正如三国时的吴国一样,周瑜之后是鲁肃,鲁肃之后是吕蒙,吕蒙之后是陆逊, ...

之后就都成司马家的了,司马家有太短命,没福气成就一代王朝。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:www.versaloon.com --- under construction

266

主题

2597

帖子

104

粉丝