⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k51说明.txt

📁 同事写的一个内核
💻 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 + -