parai
parai

注册于 8 years ago

回答
0
文章
0
关注者
0

一个人给我发了个邮件让我把移植upstream, 我才知道我在大学还干过这事,都快忘了, 5年后有一次登录。

顶!可惜自己不会开发。希望LZ能够心想事成!希望自己能够早日用上GaInOS。

万事开头难,可以学习的哦。毕竟是微内核,上手还是挺容易的。

那个就是配置工具界面,用以静态的配置生成用户需要的静态任务、资源、报警器等。


嗯,这个有意思…… 是怎么生成的呢?

报警器是啥?……

这些都是autosar汽车电子的概念,建议你上百度搜索OSEK或者Autosar。

到也不是说有了 heap 就高级……

除了静态以外还有什么其他的要求没?那个上位机界面是做什么用的呢?

那个就是配置工具界面,用以静态的配置生成用户需要的静态任务、资源、报警器等。

可以考虑基于RT-Thread来进行底层的OS,RT-Thread可以完全静态方式执行。

以前考虑过封装ucOS,但是OSEK和Autosar规范太严格,重新封装底层api太复杂,还不如基于这些os的特性重构一个。
现在GaInOS就是这么做的。

可能你不了解汽车电子领域,这一规范这一要求是有其存在的道理的,高安全性,高效率。
这一规范是几乎所有汽车电子产商都遵循的标准。
可不要认为有了heap-malloc等机制,那样的操作系统就会有多高级。
每一个不同的领域,都有其独特性。
而静态是汽车电子控制领域的一个特性。

设计阶段确定有什么好处呢?“设计阶段”指的是 LZ 的那个 wizard 或者类似的东西吧,那么,是怎么样从配置到 code 的?

这样保证了系统行为的确定性,继而保证了汽车电子的安全性。

12年本科毕业…… 唉,我已经老了……

请教个问题,“静态OS” 里的 “静态” 是什么意思?
从上面的配置界面到代码是怎样的一个过程?

所谓静态,也只是一个相对的概念。
可以这么理解,静态OS不支持任务进程的动态创建,不支持内存的动态分配,就连任务之间的同步机制也是在系统设计阶段确定的。

弱弱的请教一下,这里是不是就是把RT-Thread当成一个进程运行在linux里? [s:188]


yes.

大学or研究生or博士啊?

自动化的好多,我也自动化的说。


我大学本科生,这几天各种疯狂,实在没时间继续rtThread-posix的debug啊!

今天院长答辩,好有压力啊!不过努力没有白费,虽不是最好,但对的住我自己,我毕业了,作为一个机械设计制造及其自动化专业的学生,我毕业了。
以后只做我喜欢的事,不让人生有遗憾!
???,?? ?? ???.
??? ??? ?????.

/* 创建线程1 */
producer_tid = rt_thread_create("producer",
producer_thread_entry, RT_NULL, /* 线程入口是producer_thread_entry, 入口参数是RT_NULL */
THREAD_STACK_SIZE, THREAD_PRIORITY+3, 5);
if (producer_tid != RT_NULL)
rt_thread_startup(producer_tid);

/* 创建线程2 */
consumer_tid = rt_thread_create("consumer",
consumer_thread_entry, RT_NULL, /* 线程入口是consumer_thread_entry, 入口参数是RT_NULL */
THREAD_STACK_SIZE, THREAD_PRIORITY+3, 5);
if (consumer_tid != RT_NULL)
rt_thread_startup(consumer_tid);
加入例程semaphore_producer_consumer.c后测试,当设置优先级为所有线程中最低的时,正常,如图示:
[attachment=3]1.png[/attachment]
/* 创建线程1 */
producer_tid = rt_thread_create("producer",
producer_thread_entry, RT_NULL, /* 线程入口是producer_thread_entry, 入口参数是RT_NULL */
THREAD_STACK_SIZE, THREAD_PRIORITY-1, 5);
if (producer_tid != RT_NULL)
rt_thread_startup(producer_tid);

/* 创建线程2 */
consumer_tid = rt_thread_create("consumer",
consumer_thread_entry, RT_NULL, /* 线程入口是consumer_thread_entry, 入口参数是RT_NULL */
THREAD_STACK_SIZE, THREAD_PRIORITY+1, 5);
if (consumer_tid != RT_NULL)
rt_thread_startup(consumer_tid);

但当设置优先级一个为最高时,出现bug 运行效果如下图所示
2.png

只有空闲线程在运行,其他线程死掉。

打开rthw.c,开始debug,效果如下图示:
3.png

g_InterruptEnabled变为了false 很奇怪,原因查找中?

[attach]0[/attach]
最终完成,原来dfs的初始化只能在线程中完成。并且HEAP的给定是需要以4096为边界。

原来指针类型还有这样的怪异之处

lgnq,你原来的16位MCU移植是否也有这个问题?


瑞萨 M16C 中寻址空间有1MB,即20位
但是 sizeof(void *) = 4
所以 M16C 不存在楼主所说问题

这位朋友,我的单片机是MC9S12,不是M16C

发布
问题

分享
好友