January 09, 2009

CuRT - 精簡易懂的 RTOS - 釋出

貫徹「每年練習寫一個作業系統」的小目標,小弟今年準備小小的即時作業系統,作為 2009 年的見面禮,取名為 CuRT,全名是 "Compat Unicellular Real-Time operating system",目標定於簡潔易懂,算是在 COSCUP 2007 發表的 [Jamei RTOS] 的精簡版本,以 Revised BSD license 釋出,原始程式碼在此:[curt-src-v1.tar.bz2]。

感謝 [WalkingIce] 為 CuRT 貢獻了美麗大方的 logo:

依據他的說法是:「因為短短的程式碼給了我很『輕』的感覺,所以在背景加上了一根羽毛」。以下是 CuRT 的特徵:
  • Preemptive Multi-threading
  • Priority-base Round-Robin Scheduling
  • Simple Threading
  • Semaphore Support
  • IPC: mailbox, message queue
支援 ARM 的硬體平台,編譯之後,作業系統加上範例程式碼僅有十幾 kb 的空間。同時,希望藉由這個具體而微的 RTOS,能否協助有心探索系統程式設計者理解 ARM 整個架構進而可掌握其精神,也是 CuRT 的設計背景。

今年的規劃來看,會舉辦至少一場針對 ARM microarchitecture 為主題的的免費教育訓練,探討如何從零到有設計完整的作業系統、如何進行必要的系統初始化、如何動手理解 ARM 的種種關鍵設計,而 CuRT 就是其中的教材。請多指教,謝謝!
由 jserv 發表於 January 9, 2009 03:41 PM
迴響

寫一個OS實在太猛了o.o..

jotarun 發表於 January 10, 2009 12:02 AM

Logo 不錯看XD

lancetw 發表於 January 10, 2009 01:17 PM

看到CuRT讓我想到Kurt Cobain.....好像離題 XD
總之還是替 Jserv 鼓掌!!

bFish 發表於 January 12, 2009 12:01 AM


sqlite 的 logo 也是一隻羽毛.
不過 CuRT 的比較好看

jumbler 發表於 January 12, 2009 01:20 PM

hello,jserv:一直很崇拜你,下了curt_v1运行时,为什么cpu一直占到90%以上?
我看程序也没有某一个线程死循环呀,都挂起了呀?(用你提供的run-on-connex运行)?能否给解释一下?谢谢!

diyun 發表於 January 16, 2009 09:03 PM

@diyun,

現在沒有 Tickless scheduling,而依據 QEMU 的仿真行為,這是符合預期的。

jserv 發表於 January 16, 2009 10:31 PM

真不错,可是貌似下载不了,估计又是GFW在做怪?

bshawk 發表於 January 17, 2009 07:29 PM

jserv,another question,如果我更改了mian函数里创建的几个函数的优先级(把info_tid,stat_tid和help_tid分别改成5,8,21则会出现下面的错误,是qemu的问题吗,如果是,我应该看一些什么资料,最近我特想学习一下OS的原理.能看到你的回复,真的很感谢!

pxa2xx_clkpwr_write: CPU frequency change attempt
##################################
# Start CuRT.... #
##################################
$ ps
ID State Name
Ready idle-thread
1 Delay shell_thread
2 Running info_thread
3 Block statistics_thread
4 Block help_thread
5 Delay hello_thread
6 Delay hello2_thread
pflash_write: Unimplemented flash cmd sequence (offset 00000004, wcycle 0x0 cmd 0x0 value 0xa008c680
qemu: fatal: Bad mode 0

R00=00000001 R01=a008c6a8 R02=0000000a R03=00000000
R04=a008c6a0 R05=a008c6b8 R06=00000000 R07=00000000
R08=a008c6b0 R09=a008c6c8 R10=00000000 R11=00000000
R12=a008c6c0 R13=a008c6d8 R14=a008c6d8 R15=00000000
PSR=000000d3 ---- A svc32
s00=00000000( 0) s01=00000000( 0) d00=0000000000000000( 0)
s02=00000000( 0) s03=00000000( 0) d01=0000000000000000( 0)
s04=00000000( 0) s05=00000000( 0) d02=0000000000000000( 0)
s06=00000000( 0) s07=00000000( 0) d03=0000000000000000( 0)
s08=00000000( 0) s09=00000000( 0) d04=0000000000000000( 0)
s10=00000000( 0) s11=00000000( 0) d05=0000000000000000( 0)
s12=00000000( 0) s13=00000000( 0) d06=0000000000000000( 0)
s14=00000000( 0) s15=00000000( 0) d07=0000000000000000( 0)
s16=00000000( 0) s17=00000000( 0) d08=0000000000000000( 0)
s18=00000000( 0) s19=00000000( 0) d09=0000000000000000( 0)
s20=00000000( 0) s21=00000000( 0) d10=0000000000000000( 0)
s22=00000000( 0) s23=00000000( 0) d11=0000000000000000( 0)
s24=00000000( 0) s25=00000000( 0) d12=0000000000000000( 0)
s26=00000000( 0) s27=00000000( 0) d13=0000000000000000( 0)
s28=00000000( 0) s29=00000000( 0) d14=0000000000000000( 0)
s30=00000000( 0) s31=00000000( 0) d15=0000000000000000( 0)
FPSCR: 00000000

diyun 發表於 January 17, 2009 08:15 PM

@bshawk

不是因為 GFW,而是網站暫停服務,可改用以下位址取得:
http://people.debian.org.tw/~jserv/kernel/curt-src-v1.tar.bz2

造成您的不便,請見諒

jserv 發表於 January 17, 2009 08:18 PM

@diyun

請將 hello_tid 與 hello2_tid 的 prio 改為 21
您可以思考一下為何如此 :)

jserv 發表於 January 18, 2009 01:02 AM

jserv,今天白天没时间看代码,晚上回来研究了一下,按照你说的我改了一下,还是会出现同样的错误,下面是我的分析过程,请你指点一下:

main函数创建几个线程之后,这几个线程都在各自优先级的ready队列里,当运行到start_curt函数时,系统调度一次,shell线程首先取得运行权,他首先把优先级为1的三个线程从ready队列里删除,放到block队列里,然后等待外部命令,当我输入ps指令时,shell线程执行thread_resume(info_tid),把info_tid线程从block对列里删除,放到ready队列里,然后shell线程运行thread_delay(1),就把自己放到delay队列里,系统重新调度,这时ready对列里只有info_tid,所以info_tid取得运行权,开始运行,就开始打印thread_table里的线程状态,然后它把自己挂起放到block队列里,系统重新调度,这时shell线程的thread_delay(1),应该有timer来完成调度重新取得运行权。
就算我把线程的优先级改掉调度方法也是这样的,也不应该出错.我的分析过程是否有问题?感谢你的指点:)

diyun 發表於 January 18, 2009 11:20 PM

CuRT 小的很適合教學用。我打算把它放到下學期的 embedded system design 課程中。下面是針對它的教材內容,有錯誤的話請指教。

http://sites.google.com/site/embedded2009/introduction-to-curt-v1

wycc 發表於 January 25, 2009 09:29 AM

jserv兄,稍微跑過CuRT之後發現他非常有趣,有想要將他移植到x86或是pxa270上面執行看看的衝動,也方便作為教學範例,不知道是否有這個可能性?還是CuRT絕大部分程式碼only for arm,在移植上有困難度,謝謝指教。

koukai 發表於 February 4, 2009 04:36 PM

@koukai,
移植到 PXA27x 的話,應該只需要調整 arch/mach-pxa 的部份 SoC 硬體描述,其他應該都照舊即可。要移植到 x86 的話,要下的功夫稍微多一些

jserv 發表於 February 4, 2009 06:52 PM

Dear jserv:
感謝您分享您的心血結晶.小弟在拜讀之後..有許多的地方不解.特來請教...

1. /app/sheel/main.c
中的 shell thread 中為何要獨留 hello_thread為Ready?
其意義何在?

2. /app/sheel/main.c
依架構來看,stat_curt 中會建立一個idle_thread ..並設為 Ready 狀態
若無其他 thread Ready 時,將由 idle_thread 動作.
亦即, 若將shell thread透過 thread_suspend(current_thread->tid);
交出控制權之後, 控制權應交回Idle ... 但為何會遭強之中斷, 回到作業系統的命令列下?
但使用thread_delay();則無問題...?
Why ?

Yu-Cai 發表於 March 27, 2009 11:14 AM

CuRT 的 preemptive 似乎有些問題,只要將 shell_thread 的 priority 改成 4 就可以看到了。這樣改之後,所有的程式就無法執行了。其原因是 shell 的 context 在 preemptive(call scheduler from interrupt) 時沒有放正確。所以所有在 stack 上的變數都錯掉了。

這似似乎是 context_switch_in_interrupt 的問題,我還在看。

wycc 發表於 March 29, 2009 09:06 AM

jserv 您好

如果想去Trace瞭解這個CuRT OS

要怎麼去著手呢

可否指點一下方向

謝謝 您


guest 發表於 April 16, 2009 09:55 AM

void insert_before_list(list_node_t *after, list_node_t *pnode)
{
pnode->prev = after;
pnode->next = after->next;
after->next->prev = pnode;
after->next = pnode;
}

这个函数的实现应该是pnode插入到after的后面,但别的地方很多如: sem_pend()里调用此函数的用意好像是插到after的前面?这个函数名为什么这么取?难道你的意思是把after插入到pnode的前面?

cherry 發表於 May 28, 2009 08:13 PM

Jserv 大大

不好意思請教一個問題...
我在XP的環境下,使用qemu-system-arm 試著去模擬curt。
可是一直有以下訊息出現:

qemu-0.10.6-windows>qemu-
system-arm.exe -M connex -pflash flash-image_xp.img -serial COM1
qemu: fatal: Trying to execute code outside RAM or ROM at 0x01000000

R00=00000000 R01=00000000 R02=00000000 R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 R15=01000000
PSR=400001d3 -Z-- A svc32

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

請問一下Jserv大大有碰過類似的問題嗎?
感謝...

Alleen Wang 發表於 October 15, 2009 01:07 PM
發表迴響









記住我的資訊?