打印

PK 使人进步:highgear 向网友刘前辈提出很简单的切磋请求

[复制链接]
楼主: highgear
手机看帖
扫描二维码
随时随地手机跟帖
141
highgear|  楼主 | 2011-12-8 08:22 | 只看该作者 回帖奖励 |倒序浏览
至于我所说的那个 “bug", 在 dos 版本上是不存在的。而 51 下,我有无 bug 版本,但是不得不用一些汇编, 这是我所不情愿的。这个bug很简单,SwitchTask 调用 interrupt 时,et0 = 1 应该在 pop 之后,否则中断来临可能造成 stack overflow. 不用汇编很难解决,当然加大栈深可以避免此隐患,我还没有找到 c 下的解决办法。

刘公公,希望你能用程序代码来说话,而不是东厂的那一套,否则就别怪我问候你家人。

使用特权

评论回复
142
Cortex-M0| | 2011-12-8 09:54 | 只看该作者
highgear老师,这个 ET0 = 1, 如改为一条嵌入汇编 __asm setb ET0。确实能让中断函数保存全部的 R0到R7,A,B,dph,dpl,psw 等 SFR,但是,插入汇编是小事,但必须要打开SRC功能,由于Keil C51不支持SRC状态下的跟踪与调试,俺不常玩技术的菜鸟,觉得学习调试起来很吃力。再者,直接嵌入汇编 __asm setb ET0 指令,无法保证在 pop 之后,就如highgear老师您所言,不用汇编很难解决,但改写中断函数为汇编,不但打破了“没有一条汇编的纯C程序”,又让中断函数难以读懂。因此,俺想了一个折中的加套方法,将中断函数改为一般的内部函数,外面加个用汇编编写的套子,保护该保存的全部 R0到R7,A,B,dph,dpl,psw 等 SFR,在恢复 SFR值时,也能保证 setb ET0 指令在 pop 之后,防止BUG, 并且不影响整个os 系统的纯C代码可读性。


附highgear老师原创,俺试着改写后的 os程序,供有兴趣者测试

main_os__.rar (19.28 KB)

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
143
刘前辈| | 2011-12-8 12:26 | 只看该作者
本帖最后由 刘前辈 于 2011-12-8 19:29 编辑
#highgear
  刘公公,希望你能用程序代码来说话,而不是东厂的那一套,否则就别怪我问候你家人。


哼哼,老刘给所长的修正代码免费贴这来?太看不起我了!——万方数据上40¥一篇,有价格的。 只有所长的BUG程序到处贴,运行不了。做反面教材还可以。

………我前后发过两个 51 下的 os, (两个 dos 下的 os.) 完完全全可以运行,这么多人下载了,不能运行早就有人提出来了,我也不会把不能运行的程序发出来。


下载过highgear 第一版51版本下OS的朋友能运行的举个手,到我这领500元奖金。——不能运行的到highgear 所长那领取500元认错罚金。

第一版我在uV2下运行,什么输出都没有。经查,竟然备份6字节任务环境!那叫任务环境么?——弄懂什么叫可重入函数再来吧。

我收到的第一条朋友的消息:
     “highgear 写的51最终版OS,keil4环境下运行,第一次进入中断,程序就跑没了。……”


哈哈……highgear 是不是应该付给这位朋友500¥?别耍赖:“你具体指出来,我什么地方不能运行?……”   ——你一个54岁的职业高手自己都指不出来,却要学生给你指出来?干脆直说舍不得掏钱吧……

别以为别人看不懂你的程序,只能以“能/否运行”为标准。且看下面highgear写的调度器是如何露怯BUG的,看看这位“我也不会把不能运行的程序发出来。”的职业高手是怎样把不能运行的程序发出来的!


、、

使用特权

评论回复
144
lxyppc| | 2011-12-8 17:42 | 只看该作者
又有好戏看了

使用特权

评论回复
145
Cortex-M0| | 2011-12-8 18:13 | 只看该作者
highgear老师的第二版确实牛气冲天~~~  :victory:

俺下载后,还根据highgear老师的思路,将同时运行三个任务改成能同时运行十个任务的呢~~~  :D

highgear老师的 os_ex系统超级给力,九个任务竟能公用同一个函数,俺活了半辈子,第一次看见如何用法,牛,超级NB,有图为证!




附测试程序,供有兴趣的盆友下载试用,共同学习研究highgear老师高超的编程技术和技巧。


os_ex__.rar (22.99 KB)

使用特权

评论回复
146
Cortex-M0| | 2011-12-8 19:06 | 只看该作者
这个版本是让中断函数保存全部的 R0到R7,A,B,psw 等 SFR,便于移植。

附测试程序及源代码,供有兴趣的盆友下载试用,共同学习研究highgear老师高超的编程技术和技巧。

os_ex_1.rar (28.47 KB)

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
147
zxcscm| | 2011-12-8 19:24 | 只看该作者
顶 !!!

使用特权

评论回复
148
刘前辈| | 2011-12-8 19:57 | 只看该作者
本帖最后由 刘前辈 于 2011-12-8 19:59 编辑

呵呵,先教教123jj怎么写程序:所长不会写这么菜的程序吧;如若127个任务怎么办?也跟所长学学写成一个公用的程序,800个也一样!

#144楼



写成:

void Test( )
{
char c;
while (1) {
  while (!RI)
        Sleep(10 );
    RI = 0;
  c = SBUF;
SetSemaphore(c-'1'+1);
}
}



、、

使用特权

评论回复
149
Cortex-M0| | 2011-12-8 20:15 | 只看该作者
呵呵~~~

俺水平太菜,连所长的一点皮毛都没学会,真希望所长还能常来,给俺们小菜上上课~~~

很想念所长~~~

使用特权

评论回复
150
刘前辈| | 2011-12-8 20:24 | 只看该作者
本帖最后由 刘前辈 于 2011-12-8 20:32 编辑

M0版主别尽用简单的127个任务忽悠人,有本事别关中断,——任务用户没有控制权管理中断;像老刘这样写16个不同的任务,再写几个固定频率闪光流水灯同时输出。——哈哈,你关了中断,系统节拍(心脏)还跳吗?时钟还走吗?系统还是RTOS吗?固定频率闪光流水灯怎么办?硬实时任务怎么办?所长不是小孩子玩过家家。——和你一个人在家玩还行,忽悠大众就不行。

#include <REG51.H>
#include <stdio.h>
#include "os.h"
#include "task.h"


char *p=
"The compiler recognizes direct calls to interrupt \n"
"functions and rejects them.\n"
    "It is pointless to call interrupt procedures directly,\n"
"because exiting the procedure causes execution of the RETI \n"
"instruction which affects the  hardware interrupt system of \n"
"the 8051 chip. Because no interrupt request on  the part of \n"
"the hardware existed, the effect of this instruction is \n"
"indeterminate  and usually fatal.---Do not call an interrupt\n"
"function indirectly through a  function pointer. \n\n";

void InitializeComPort()
{
        SCON  = 0x50;
        TMOD |= 0x20;
        TH1   = 0xF0;
        TR1   = 1;
        TI    = 1;
}


char putchar (char c)
{
        SBUF = c;
        while (!TI);
        TI =0;
        return c;
}

void Test1()
{
        while (1) {
        id = GetCurrentTaskID();
        printf("***** Test %d \n", (int) id);
         WaitForSemaphore();
                }
}
// …………
void Test15()
{
        char id;
        while (1) {
        P1=~P1;
         Sleep(500);
}
}

void Test16()
{
        char id;
        while (1) {
        id = GetCurrentTaskID();
        printf(p);        
        WaitForSemaphore();
}
}
void Test()
{
        char c;
        while (1) {
        while (!RI);            
        RI = 0;
        c = SBUF;
        SetSemaphore(c-'a'+1);
}
}



、、

使用特权

评论回复
151
Cortex-M0| | 2011-12-8 21:00 | 只看该作者
再不行,将OS系统造假成依次执行,别说连续输出800个字,连续不间断工作8小时,输出800亿个字都行~~~  :D

使用特权

评论回复
152
Cortex-M0| | 2011-12-8 21:13 | 只看该作者
或者抄抄PC机的文本打印功能,搞个任务输出排队系统,依次输出显示,不充许下个任务插队~~~  

总之,天朝有 5000年历史,造这么一点假小菜一碟~~~ :)

使用特权

评论回复
153
刘前辈| | 2011-12-8 21:49 | 只看该作者
#151楼
再不行,将OS系统造假成依次执行,别说连续输出800个字,连续不间断工作8小时,输出800亿个字都行~~~  


唉!说了半天老刘的意思123jj都没明白:RTOS是管理多任务并发的;你单任务独占CPU,别的任务怎么并发——多道并行推进?玩了半天OS,还在这想来想去想裸奔办法怎么多道并发呢;回家玩“些微优先权”去吧。

还是看看老刘怎么玩既让流水灯按时闪烁,又让多个打印任务顺序输出不乱,既并发又同步,哈哈,这才是真正的RTOS。所长写的那个玩玩还行,随便几个任务并发就崩溃了。举个简单的例子,所长写的Semaphore,——信号量啊?Dijkstra,OS大师发明的影响世界OS领域发展的机制耶;让所长3条语句就完成啦?唉,可惜所长没早生20年,要不中国也诞生影响世界的OS大师啦!哈哈,玩OS过家家呢。

     忘了补充一条:任务用户没有管理中断的权限,关中断只能关几个字节才可能不影响内核,基本原理和裸奔一样:关中断的时间只能远远小于系统节拍(这里10ms)才不会丢失时标。所以,一个printf( )任务根本不可能使用关中断来解决,printf( )任务的开销是不定的,80秒,800秒都有可能,——你关闭中断1秒钟试试?Sleep( )可能永远睡眠,醒不过来啦。——OS技术是用信号量或者锁机制解决Printf()类似问题的;所长的Semaphore()行吗?
      ——所长是这种什么事凑合玩的人吗?


、、



、、

使用特权

评论回复
154
highgear|  楼主 | 2011-12-8 22:10 | 只看该作者
刘公公,你就是一个大傻笔。
让你写个程序,你就哭天喊地,说欺负菜鸟,只差说自己是萨比了。不理你,就洋洋洒洒狂吠,与我邻居家的狗一个德行。

printf 这种简单至极的东西,也就你这种“顶尖“的傻笔当作不得了的东西,我既然可以写出一个 os, 可以实现信号量,还有实现自动互斥的版本,让每个任务不用关中断使用 printf 是轻而易举的事情。刘公公你这种萨比真是一个萨比!

刘公公,不要使用我的代码,自己去写一个 OS 出来。没有见过这么不要脸的**,一边用着别人的代码,一边还大言不惭。刘公公你这种萨比真是一个萨比!

使用特权

评论回复
155
highgear|  楼主 | 2011-12-8 22:22 | 只看该作者
144楼 Cortex-M0的程序基本上就是实现了互斥,如果没有其他非互斥的程序使用 printf, 那么就可以把printf 的开关中断去掉。保证不可重入的函数没有冲突,这是极其极其简单的事情,拿来大作**简直就是一个可笑的萨比。

使用特权

评论回复
156
highgear|  楼主 | 2011-12-8 22:36 | 只看该作者
146 楼Cortex-M0 的办法应该是最好的办法了,基本上平衡了可读性和底层处理的冲突。

看来在 51 下的 os 不用汇编是不可能了。

使用特权

评论回复
157
Cortex-M0| | 2011-12-9 08:25 | 只看该作者
highgear老师:
也有例外,当任务不多时,如您的第二版实例,不大于3个任务,这类 微型 os_ex系统,完全可以不用插入汇编,直接利用 51的 4个工作寄存器区来切换,您的第二版,如将 3个任务分配在 3个工作寄存器区内,第 4个工作寄存器区用于定时中断,则根本不用插入汇编保护 R0至R7 的任何寄存器。


附highgear老师的第二版,不用保存任何 R0至R7寄存器的测试程序,供有兴趣的盆友下载试用,共同学习highgear老师高超的编程技术和技巧。

os_ex_2.rar (22.02 KB)

使用特权

评论回复
158
Cortex-M0| | 2011-12-9 08:36 | 只看该作者
唉!说了半天老刘的意思123jj都没明白:RTOS是管理多任务并发的;你单任务独占CPU,别的任务怎么并发——多道并行推进?玩了半天OS,还在这想来想去想裸奔办法怎么多道并发呢;回家玩“些微优先权”去吧。

还是看看老刘怎么玩既让流水灯按时闪烁,又让多个打印任务顺序输出不乱,既并发又同步,哈哈,这才是真正的RTOS。。。。。。

     忘了补充一条:任务用户没有管理中断的权限,关中断只能关几个字节才可能不影响内核,基本原理和裸奔一样:关中断的时间只能远远小于系统节拍(这里10ms)才不会丢失时标。所以,一个printf( )任务根本不可能使用关中断来解决,printf( )任务的开销是不定的,80秒,800秒都有可能,——你关闭中断1秒钟试试?Sleep( )可能永远睡眠,醒不过来啦。——OS技术是用信号量或者锁机制解决Printf()类似问题的。。。。。

刘前辈 发表于 2011-12-8 21:49


要实现自动互斥,让每个任务不用关中断使用 printf 是轻而易举的事情。

老是拿这类小小儿科做**,让人提不起任何兴趣,您觉得有意思吗?还是您老留着慢慢享用吧~~~

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
159
Cortex-M0| | 2011-12-9 08:39 | 只看该作者
散会啦~~~

有点时间的盆友,欢迎阅读highgear老师最新大作

[侃单片机] 主题:授之以渔: 卡尔曼滤波器 ....大泻蜜 .........................
https://bbs.21ic.com/icview-292853-1-1.html

使用特权

评论回复
160
柳江蔗农| | 2011-12-9 09:14 | 只看该作者
膜拜

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则