📄 k51说明.txt
字号:
1. k51简介
适用于MCS-51的占先式的小 kernel,简单实用,体积小,RAM需求小。
最多4个任务,各占一个register bank (不需要向堆栈存r0-r7了!)。
main() 是4个任务中的一个。
简单有效的 signal 和 mutex。
2 k51的使用
2.1 k51编程接口
void k51_init()
所有的等待timer置为0,除main()外的任务设为 not-ready, main()为ready 和 running。
根据PRIO_MAIN设置 register bank。
unsigned char task1_init()
unsigned char task2_init()
unsigned char task3_init()
unsigned char task4_init()
设置任务的堆栈,置任务为ready、not-running。直到下一次中断或等待,
刚刚完成init的任务才可能running。
void k51_sleep(unsigned char count_ticks)
使任务进入idle,count_ticks个节拍后恢复为ready。
void k51_signal_init(unsigned char idata* p_sig)
对一个信号进行初始化,应当在wait和send的调用前调用这个函数。信号初始化后是not-signaled。
void k51_signal_wait(unsigned char idata* p_sig)
如果信号不是signaled状态,任务将进入idle,直到isr或另一个任务send这个信号。
如果信号是 signaled状态,任务将继续running而信号成为not-signaled。
void k51_signal_send(unsigned char idata* p_sig)
发送信号。如果没有任务在这个信号上等待,则这个信号被设为signaled状态;如果有任务在等待,并它的
优先级更高,则进行任务切换;如果等待的任务的优先级更低,则把它置为ready, 但不进行切换。
void k51_mutex_init (unsigned char idata* p_mut);
对一个互斥体进行初始化,应当在wait和send的调用前调用这个函数。互斥体初始化后是available。
void k51_mutex_wait (unsigned char idata* p_mut);
如果互斥体不是available状态,任务将进入idle,直到另一个任务release这个互斥体。
如果互斥体是 available状态,任务将继续running而互斥体成为not-available。
void k51_mutex_release(unsigned char idata* p_mut);
释放互斥体。如果没有任务在等待这个互斥体,则这个互斥体成为 available 状态;如果有任务在等待,
则最高优先级的等待任务被设为 ready, 如果它的优先级高于当前运行的任务,则切换任务;如果上述
被设为 ready 的任务优先级更,则不进行切换。
void k51_tick();
在时钟中断调用这个函数。如果不使用 sleep 功能,则可以不调用它。每次调用都会使正在 sleep 的
任务的 sleep 时间减少1,直到变成0,这时该任务将会变为 ready。
unsigned char data k51_int_nest 和 void k51_int_exit()
这些参考了uC/OS-II。进入中断使 k51_int_nest 增1,离开中断使 k51_int_nest 减1,
并调用k51_int_exit(),可能的任务切换会在这个函数中进行。
2.2 用法说明
在 k51_cfg.inc, 设置 main()所占用的优先级,是否允许task3及task4
(注意如果不允许task3就一定不要允许task4),是否允许mutex。
项目中应当包含k51start.asm, 它是从C51的STARTUP.A51改写而来的.
需要特别的启动码应以 k51start.asm 作为起点。
在k51_a.asm里,根据k51_cfg.inc的配置,含入了适当的源程序文件。所以在build项目的时候,
应当包含k51_a.asm,不是k51a1234.asm,k51a123.asm和k51a12.asm中的任一个。
除了main(),任务对应的函数必须是 void task1(); void task2(); void task3(); void task4();
2.3 应当注意的问题
2.3.1 只允许一个任务在一个 signal 上等待。
如果有两个以上任务同时在等待一个 signal, 则向这个 signal 进行 send 时,其中的一个任务
成为 ready, 等待列表完全清除,其它任务将永远没有机会恢复运行。
2.3.2 尽量用汇编写 isr
好处多得不得了。尤其是,在 RAM 宝贵的51上面,可以显著减少堆栈空间需求。
2.3.3 不能用 C51 的 interrupt 关键字定义中断服务函数
它不能提供所需要的堆栈结构。可以在进入中断用汇编调用c函数,但需要向堆栈保存r0-r7.
所以强烈推荐用汇编写 isr。
3 大致的统计数据
没有任务的代码大小。
---------------------------------------------------
use mutex no mutex RAM req
---------------------------------------------------
4 tasks 1070 886 9Bytes+12bits
3 tasks 765 655 7Bytes+9bits
2 tasks 510 452 5Bytes+6bits
---------------------------------------------------
上述的Bytes在"data": 0-7fh.
每个signal 或 mutex 需 1 字节, "idata", 0-ffh.
4 产生k51的背景
我学习和使用MCS-51有很长时间了,前一段时间学习uC/OS-II,看了高人在8051上的移植,看得头大无比。
我写程序有些追求简单或者说简洁,看到这些程序感觉非常的不爽。于是自己写了一个小kernel。我自己
以后应当会经常用它的!
可能早有类似的东西了,我信息不灵,是井底之蛙,大家不要笑我!
戈卫东, 2005-12-2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -