这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » utenux与其它嵌入式操作系统的对比

共19条 1/2 1 2 跳转至

utenux与其它嵌入式操作系统的对比

菜鸟
2013-06-10 11:36:46     打赏

组名:无版权限制的ARM

组员:julei0594

今天初步看了一下utenux,首先与ucos对比,因为uloong提供的工程问题,所以在三种编译系统中多是采用一个工作组,然后多工程方式,子工程形成输出文件,在bin工程中集成编译,这种模式与uclinux的编译模式类似,与ucos不同,ucos只提供各种核心文件,提供在一个目录下,然后使用者进行移植,相当与utenux中的kernel文件包,以这种模式提供,用户自由度比较大,但工作量比较多。utenux提供方式等于已经移植完毕,这样新工程中的许多设置必须与原工程一致。对于keil来说,主要在define定义芯片类型,include包含文件目录。

此种工程组织方式在编译时候可以减少时间,只要选择修改完成的进行编译,但在程序分析时候比较麻烦一点,比较难以找到相应函数




关键词: utenux     其它     嵌入式     操作系统     对比    

菜鸟
2013-06-10 14:54:47     打赏
2楼
这两天会有新版本发布,简化了工程,GCC下只有一个makefile和makefilecommon文件,keil和IAR下都只有一个工程,三种环境都是以芯片划分工程,这样大家用起来就更方便了,相信用户看起来也更清晰了。

院士
2013-06-13 09:11:41     打赏
3楼
这种事情各有利弊,但是多数童鞋都是先入为主,人家st与ti都是以芯片为示例的。

菜鸟
2013-06-14 13:14:09     打赏
4楼

utenux 程序流程

main()主函数,使用tk_sta_sys启动系统。

tk_sta_sys中,关闭中断,然后使用InitModule调用各种中断,具体采用函数指针实现不同功能调用knl_init_task_startup初始化任务,包括tk_cre_tsk_impl建立任务,tk_sta_tsk_impl启动任务,然后进入inittask调用Usemain(),等待用户通过串口输入数据终止操作系统,在串口中随便输入一个数据,则进入tk_ext_sys,在此函数中有熟悉的死循环for(;;)。

以上操作跟踪可以使用keil软件仿真,使用UART#1监视与操作

 

 

 


高工
2013-06-14 13:41:01     打赏
5楼
慢慢地  会有人发现这种组织方式的好处的。比如,hanshuyujifen2同学已经慢慢习惯这种方式了

菜鸟
2013-06-17 09:18:04     打赏
6楼

6-18 

实验1:

1.打开hook
增加
Debug svc hook function is entering 

    task ID is  3  主要显示现在执行的任务ID,调试使用

程序流程:

   任务B,启动任务A,C,启动任务A后,任务Asleeping,然后任务B在等待输入,如果输入不为e,则任务B进入sleeping ,任务C执行,任务C为一死循环,当任务B sleeping 时间到后,有进入任务B,继续上一流程,直到任务B输入e,退出任务B,并终止任务A,C,无法理解为什么任务A睡眠时间到后,不继续进入任务A
6-26

实验2:

任务A开始,获取信号量,释放信号量,然后进入sleeping ,任务B开始,获取信号量,释放信号量,与例1中一样等待输入,

关键:

tk_wai_sem,tk_sig_sem对信号量进行操作

实验3

事件记录,主要流程如实验2

关键

tk_wai_flg,tk_clr_flg,ercd=tk_set_flg

中间Delay使用等待,时间比较长,应该可以处理其他事件

实验4

任务A,tk_snd_mbx,tk_rcv_mbx

任务B,tk_rcv_mbx,接受任务A消息,然后,tk_snd_mbx发送另外消息

实验5

tk_loc_mtx,提高优先级,锁定,读取数据,tk_unl_mtx,还原优先级,解锁,

前提,低优先级任务不能打断高优先级任务,保证高优先级任务读取数据时,低优先级任务不进行操作。

实验6

tk_snd_mbf,tk_ref_mbf,主要为两个数组,一个接受,一个发送,每个任务向自己的发送数组发送数据,然后再判断接受数组中的内容,另外一个任务的接受与发送为相反,从而实现两个任务之间的消息传递。

实验7

暂未发现用处,需继续理解

tk_acp_por,tk_rpl_rdv

实验8

建立5个内存单元,任务A输出内存中的内容,并释放内存。tk_rel_mpf,内存容量增加

任务B使用内存,ltostr,内存量减少,任务B调用A,使用内存,并释放

实验9

使用可变内存,任务B,tk_get_mpl得到一定尺寸的内存,任务a释放,与实验8为内存的不同使用方法。

其实可以做成在一个任务中调用与释放,另外一个任务使用此内存,任务完成后传递信号量。

实验10

使用tk_get_otm得到时间,然后再显示相应时间信息。、

实验11

使用tk_cre_cyc建立一个周期,并设定相应周期参数,周期到时调用CycHandler

需要了解tk_cre_cyc的使用,是否是采用定时器终端,需要进一步研究。

实验12

建立警报,tk_cre_alm,tk_sta_alm,然后采用延时等待,警报时间到后,调用函数AlarmHandlerAlarmHandler

实验13

文件在sysdepend目录中,选择armv7_m目录下文件。

文件结构是在任务重等待9秒钟,在每1秒钟内会有一个中断产生,在中断中输出相应文件。次试验无法体验出操作系统的优越性。

实验14

使用tk_ref_ver读取版本信息,并显示

实验15

综合程序,把以上实验总结起来

例程分析:

1,实际系统中会出现一个死循环,在例子中usemain中有一个,但在操作系统中也不一定需要退出,

2. 信号输入采用串口输入,并且是采用等待方式,实际系统中一般不会在串口数据中采用等待方式,可以在中断中接受数据,然后对一个信号量赋值,在其他任务重判断信号量,进行处理。

3,延时,实际操作中延时采用标志位判断,一般不会使用delay,只有在硬件仿真中可能使用delay,可以采用实验10中的时间标志方式实现延时

4,多任务实现,例程中的多任务同时只能有一任务执行,其余任务处于睡眠状态,实际中应该是产生一个新的任务,此任务优先级高,会使原来任务停止,并保留原有任务信息,高优先级任务完成后,继续执行低优先级任务。

5.命令输入,综合程序中有命令输入功能,实际操作系统需要有个命令解析,例如list,kill等,此处list定义为查看现有运行任务状态


菜鸟
2013-06-17 09:18:09     打赏
7楼

utenux内核分析

数据结构

 任务的结构体,必须记熟悉。

typedef struct task_control_block           TCB;

typedef struct queue {

                struct queue          *next;

                struct queue          *prev;

} QUEUE;

注意队列的定义是自我嵌套的,调试时可以看到此变量会一直向下延伸。

struct task_control_block {

                QUEUE             tskque;    

}

查找队列时使用一种地址赋值方法。

  tcb = (TCB*)queue;  指把队列的首地址赋给任务首地址

实验1

任务的建立

typedef void       (*FP)();                  /* Function address general */

typedef struct t_ctsk {
 VP                  exinf;                   /* Extended information */
 ATR                 tskatr;                  /* Task attribute */
 FP                  task;                    /* Task startup address */

..};

其中task参数传输了函数指针,在建立任务时给此指针赋值,

ctskA.task    = PorSampleTaskA;

函数指针的调用与转移在内核中进行:在定时器中断中对队列操作实现调度knl_timer_handler(此处需要仔细分析)

对于任务有一个queque,对此队列进行操作knl_queue_insert等实现了任务的调度。

knl_tksvctbl[] ={ (FP)knl_no_support , (FP)tk_cre_tsk_impl,...};

内核函数调用表,可以直接使用数组下标来对函数进行寻址

 

实验7

端口的数据结构 

typedef void                         *VP;    

typedef UW                              ATR;

typedef                struct t_cpor {

                VP                  exinf;                              /* Extended information */

                ATR                 poratr;                          /* Port attribute */

                INT                 maxcmsz;                 /* Maximum len of call message(byte) */

                INT                 maxrmsz;                 /* Maximum len of replay message(byte) */

                UB                  dsname[8];               /* Object name */

} T_CPOR;

poratr 的值为TA_TFIFO Manage wait task by FIFO

tk_acp_por  实际运行时为tk_acp_por_impl,主要建立porcb返回cmsgsz

    get_porcb主要是返回一个结构体PORCB定义的地址

    然后找到对应的任务,通过queue != &porcb->call_queue得到相应的任务指针tcb,使用tcb->winfo.cal.cmsgsz对cmsgsz进行赋值。

     判断calmsg[0]得到rplmsg[0],

tk_rpl_rdv,根据rplmsg[0],

   knl_wait_release_ok等待释放 


  8-21

  

以上为内核部分程序结构,其余还有libdev-主要对串口,看门狗,时钟,flash进行定义,libtm-主要是对字符串进行操作,起监视作用,这一部分与操作系统无关,主要使用户使用方便,同样可以移植到ucos中

 


菜鸟
2013-06-17 09:18:16     打赏
8楼

7/28

ucos例程

在micrium.com/可以增对不同芯片下载相应工程文件,我下载了atmel与stm32的工程文件,下载文件为exe文件,安装程序为解压缩。

SAM3S中有Keil,IAR,TrueSTUDIO工程,无法编译通过,需要更改程序,主要原因是与操作系统相关的一些宏定义没有定义。

STM32中只有IAR工程,可以编译通过,并且可以使用软件仿真,但此例程中没有输出,所以在比较utenux例子1时需要增加串口输出信号。



菜鸟
2013-06-17 09:18:23     打赏
9楼
 

ucos内核分析

数据结构

os_tcb任务结构体

中增加了时间变量OS_TICK     TickCtrPrev等,所以任务的启动与停止等于时间有关。

OSSched增加了调度文件

8-21

从文件结构来看,ucos的文件结构分类比较明确,使用如下种类

os_core 内核

os_mutex

os_mem 内存

os_q 队列

os_flag

os_task

os_mbox

os_time

os_tmr

os_dbg

os_cpu

 


菜鸟
2013-06-17 09:18:33     打赏
10楼

utenux与ucos比较

数据结构

os_tcb任务结构体

中增加了时间变量OS_TICK TickCtrPrev等,所以任务的启动与停止等于时间有关。

OSSched增加了调度文件

8-21

1 文件结构的比较

 1.1 头函数

   在嵌入式c语言中,头函数的包含比较重要, 

    ucos中使用了include.h等,在工程中只包含了C文件,没有包含h文件

  utenux工程中包含了C文件与h文件,从工程结构上看,比ucos复杂

 1.2 文件结构

  ucos根据功能分文件,一个功能在一个文件中包含

  utenux根据文件夹格式来区分,分knl_(内核部分),tk(),每个文件分类比ucos要细,导致从整体结构上理解结构关系比ucos负载一些。

2 每个程序中子函数的比较

    对于主要程序部分,每个操作系统中的子函数结构类似,一般包括建立,删除等。

3 汇编部分的比较

    utenux中的调度采用了汇编语言实现。


 


共19条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]