试图在8051立法会设计的RTOS内核

O

opentdoors

Guest
您好每个人的!

我在这个论坛的新成员。我来自越南作为一个电子工程师。
我试图设计基于89C52与8KB的RAM的分机上的RTOS内核。它只是学习的方式实时Linux操作系统。

我evalution董事会由在0x8000与8K的内存(6264)89C52的。有16个在我的设计任务,每个任务有一个256字节的外部存储器。例如:

-任务从0x8000到0x80FF分机号负责0
-任务1 ---------------------- 0x8100到0x81FF
...
-任务15 ---------------------- 0x8F00到0x8FFF

使DPH = task_id或80,达莱马= 0x00到0xFF。

每个任务有一个字节计数器。当定时器中断发生,应对任务是递减的,如果任务计数器达到零
, 那么这个任务就绪状态。
计数器阵列放置在内部RAM中,由R0 ponted。当一个任务在运行,它会调用一个Ondelay重置其反。

还有其他两个数组的内部RAM中,信号量(仅二进制信号量)阵列和事件的数组。当一个任务也是在空闲模式下
, 直到一个计时器中断发生在等待状态的信号,8051的CPU。当一个任务处于等待状态的事件,它的奥尔韦转sheduler例程。

Sheduler是计数器阵列为基础的例行改变任务的两个变量编号:running_id和blocke_id,那么它调用context_switching节省内部封锁的任务堆栈来完成这项任务的外部记忆体,恢复堆栈的下一个任务的内容。新任务将在跑官“雷蒂”状态。

抱歉,下一次我会在后某些源代码8051 asm编写。

谢谢
最后由opentdoors编辑于05年2月16日7点24分,编辑1次共

 
所有任务的定义在程序存储器是这样的:

tasktable:

干重task0
干重task1
...
干重task15

256字节每项任务的外部RAM,我用了从0x00中保存的地址。

堆栈设备系列5FH
网页设备系列80H
xSP的设备系列0FDH
_createTask:/ *任务id =协调; R0 =任务的优先级* /

检验手段B,一个
检验手段dptr,#tasktable
rl 1
公司1
movc 1,@ 1 dptr
推进协调会
检验手段的A,B
rl 1
movc 1,@ 1 dptr
推进协调会
推psw
推0
推1
..
推动7
推进协调会
推b
推DPH
推达莱马

检验手段1,#页
魔术的A,B,或0x80 task_id
检验手段新社
CLR的一
检验手段达莱马,一
create_xsp:/ *保存栈内存* /
流行协调会
执行MOVX @ dptr,一
公司dptr
检验手段一,藻
cjne 1,#栈,create_xsp
/ *创建合作局* /

推动达莱马;节省转栈
检验手段1,#xSP的
检验手段达莱马,一
流行协调会
执行MOVX @ dptr,一
公司dptr
检验手段一,R0:任务的优先级
执行MOVX @ dptr,一
公司dptr
检验手段一,DPH
执行MOVX @ dptr,一
退赛22分钟后添加:任务骨架可以定义:

task0:
/ *任务*身体/
检验手段1,#counter0
lcall _timeDelay
ajmp task0

task1:
/ *任务*身体/
检验手段1,#counter1
lcall _timeDelay
ajmp task1

....
task15:
/ *任务*身体/
检验手段1,#counter15
lcall _timeDelay
ajmp task15

该_timeDelay函数将复位计数器的每个任务。由定时器计数器的中断程序递减每项任务。当任务来反为零,这项工作将在就绪状态,如果有两个或三个..任务在就绪状态,则有更高的优先任务来运行状态。

如果定时器每2ms的ISR的发生,那么任务的反=#counter_n * 2毫秒,任务将是运行每(#counter_n * 2毫秒)。每项任务的计数器是一个WORD变量。

 
xTimeDelay设备系列0FBH

_timeDelay:
/ * 1 =计数器高字节,R1 =计数器低字节* /
CLR的鄂;禁用中断
推DPH
推达莱马
推0
推b

检验手段B,一个
检验手段一,running_id; running_id是在内部RAM中的全局变量
检验手段新社

ANL汽车1,#0FH
添加,#taskcounters; taskcounters是计数器阵列地址
检验手段R0,1; R0点
, 以解决反运行任务
检验手段1,#xTimeDelay;将WORD变量的地址在外部RAM
检验手段达莱马,一
检验手段1,R1
执行MOVX @ dptr,一
公司dptr
检验手段的A,B
执行MOVX @ dptr,一

检验手段@ R0,1
流行b
流行0
流行达莱马
流行DPH
setb鄂
setb IDL中; PCON.0进入空闲模式
退赛24分钟后添加:这是sheduler功能,它检查计数器阵列检测的task'counter来改变零两个变量的内容:running_id和suspend_id。然后切换上下文例行这些变量转换为基础。

_sheduler:

CLR的鄂
推psw
推0
...
推动7
推进协调会
推b
推DPH
推达莱马

R2的检验手段,#0FFh;初步任务的优先级
检验手段R0,#taskcounters
检验手段,#页DPH,DPH = 0x80
检验手段R1,#0Fh
检验手段suspend_id,running_id

_loop:

检验手段一,@ R0
jnz _next
检验手段1,#优先
检验手段达莱马,一
执行MOVX 1,@ dptr;得到任务的优先级
检验手段B,一个
subb 1,R2的,如果“R2的
捷迅_next;
R2的检验手段,乙;埃尔斯如果“R2的那么R2的= 1
检验手段1,#task_id
检验手段达莱马,一
执行MOVX 1,@ dptr;获取任务的ID(task_id = id或0x80)
检验手段resume_id,一
_next:
公司R0
公司DPH
djnz R1,_loop

检验手段running_id,resume_id

/ ** /2小时后添加:这种情况下切换例程。此例程复制内部堆栈ponted由目前的任务藻登记(确定DPH)的外部RAM,然后保存达莱马登记内容的位置256个字节的外部RAM xSP的。

_contextSwitching:

检验手段一,suspend_id
检验手段新社
CLR的一
检验手段达莱马,一
save_context:
流行协调会
执行MOVX @ dptr,一
公司dptr
检验手段一,藻
cjne 1,#栈,save_context
推达莱马
检验手段1,#xSP的
检验手段达莱马,一
流行协调会
执行MOVX @ dptr,一

检验手段一,resume_id
检验手段新社
执行MOVX 1,@ dptr;达莱马= [xSP的]
检验手段达莱马,一
restore_context:
12月dptr
执行MOVX 1,@ dptr
推进协调会
检验手段一,达莱马
jnz restore_context
流行达莱马
流行DPH
流行b
流行协调会
流行7
...
流行0
流行psw
雷蒂22分钟后添加:这_timer例行TimerISR调用。当它调用,这个例行任务递减一个柜台。

_timer:
推进“0,1,dptr,行政协调会,乙”
检验手段R0,#taskcounters
检验手段R1,#0Fh;循环指数
_tloop:
检验手段一,@ R0
延安组_tcheck
12月@ R0
k1:
公司R0
djnz R1,_tloop
退赛
_tcheck:
检验手段一,R0
subb 1,#taskcounters;得到编号
魔术1,#页; task_id = id或0x80
检验手段新社
检验手段1,#xtimeDelay
检验手段达莱马,一
执行MOVX 1,@ dptr;获得高字节
延安组k1
12月1
执行MOVX @ dptr,一
公司dptr
执行MOVX 1,@ dptr;得到低字节
检验手段@ R0,1
sjmp k1

 
是否有任何人都可以给我一些意见对我的设计?

我认为,这是更好的发展的RTOS在英国皇家特许状的AVR的或PIC立法会。我见过一些实时操作系统8立法会像萨尔沃,uCOS -Ⅱ位,TinyRTX凯尔....39分钟后添加:这里是信号处理例程。我创建了一个二进制信号量的数组称为“mutex_buf在内部RAM”的R0指出(或R1)。

mutex_buf 是布尔:零或非零。

Each element of mutex_buf assigned a resource like port, memory.. 例如:

PORT_sem设备系列氢
检验手段1,#PORT_sem;这里信号id是PORT_sem,身份证= 0 ÷ 15_semCreate:
/ *行政协调=信号灯的ID,R1 =初始信号(零)值* /

推0
检验手段R0,#mutex_buf
加一,R0
检验手段,一,R0指向[mutex_buf R0 一];mov a,R1; may be "clr a" 检验手段@ R0,1 *(mutex_buf)= R1
流行0

退赛

当一个任务访问共享资源,它愿意等待信号灯分配这个资源采取访问的权利。
无效semWait(UCHAR semaphore_id)

而(semaphore_id);
semaphore_id = 1;


在asm:
_semWait:
/ * 1 =信号量ID * /
CLR的鄂
推0
检验手段R0,#mutex_buf
添加,R0
检验手段一,@ R0
jnz _semWaiting
检验手段@ R0,#1
流行0
setb鄂
退赛

_semWaiting:
流行0
setb鄂
setb IDL中;转到空闲模式
sjmp _semWait

_semSignal:
/ * 1 =信号量ID * /
CLR的鄂
推0
检验手段R0,#mutex_buf
添加,R0
检验手段R0,1
检验手段@ R0,#0小时
流行0
setb鄂
退赛

因此
, 一个任务可以写成这样,与常规_semCreate上面创建信号:

_task:
.......
检验手段一,PORT_sem
lcall _semWait
....处理港口
lcall _semSignal
.....
检验手段1,#柜台
lcall _timeDelay
ajmp _task

 
大家好,

我摹坎南,我在这里设计一个调度8051(基于优先级抢占)。

我需要help.i希望调度程序设计流程
, 以及如何发生的上下文切换。期待着听到美国

暂邮件我kannan_emb(在)yahoo.com

谢意和慰问
坎南

 
对不起。在以前的时候,我说sheduler时调用在等待事件状态的任务。

但我RTOS的算法是循环赛。因此,CPU的空闲状态来当任务等待
, 直到定时器中断事件发生。

事件标志是一个字节是它的价值目前的255个不同的事件。它的任务在等待事件的状态可以写:

_task:
检验手段1,#_eventType
lcall _eventWait
/ *处理* /
ajmp _task

在伪_eventWait岛代码:
无效_eventWait()

taskcounters [running_id] = 255;
中频(事件== _eventType)则
事件= 0;
否则转到IDLE_MODE;


变量的活动内容而订定的其他任务。

 
thinkey说:

为什么不张贴流程图,而不是汇编代码?
 
我喜欢asm的C语言,C 。
而且我写的52实时操作系统,为您的文章很多感谢。

 
汇编代码可能很难理解比C代码。但是
, 由书面方式汇编代码的内核,内核可能会追查程序计数器的值来控制的任务。

在C书面方式申请,利用内核系统调用依赖于编译器。

 
你可以发布所有的代码在一个文件中。
whats是在许多后张贴的需要?


 
我想用C语言的实时操作系统。它的精度是作为程序是由ASM语言编写的?

 
elchula说:

我想用C语言的实时操作系统。
它的精度是作为程序是由ASM语言编写的?
 
这将更好地理解,对于我这样的人谁不是那么好大会,只有C使得这一切......

祝您好运

 
我特林设计一个RTOS的我有没有同在代码对所述的任务
, 汇编代码的解释问题是fissed在一个精确的数字?O可以被修改第二个要求是什么?

 
杰克/ /阿尼说:

这将更好地理解,对于我这样的人谁不是那么好大会,只有C使得这一切......祝您好运
 

Welcome to EDABoard.com

Sponsor

Back
Top