打印
[匠人手记]

关于《匠人手记》一书的几个问题

[复制链接]
2917|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
myworkmail|  楼主 | 2009-12-15 17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天买了本《匠人手记》,就是冲着《编程思路漫谈》一文买的,是比网上的多了些流程图什么的,但是有些我还是没看明白。
问题如下:
1。优先调度机制中,优先级是怎么处理的,是否是把优先级高的放在程序的主循环的前面来处理,另程序执行完优先级高的模块,怎么返回用GOTO。
2。时间片与分时调度机制中假如我在执行一个函数,时间到了(如定时器时间到了),我要处理另一个功能模块了,那么我现在执行的函数怎么处理,做现场保护?(用汇编去压栈?)汇编和C的接口怎么处理?(如IAR)?在多工序程序结构是否存在同样的问题?

相关帖子

沙发
myworkmail|  楼主 | 2009-12-15 17:29 | 只看该作者
昨天买了本《匠人手记》,就是冲着《编程思路漫谈》一文买的,是比网上的多了些流程图什么的,但是有些我还是没看明白。

问题如下:

1。优先调度机制中,优先级是怎么处理的,是否是把优先级高的放在程序的主循环的前面来处理,另程序执行完优先级高的模块,怎么返回?用GOTO。

2。时间片与分时调度机制中假如我在执行一个函数,时间到了(如定时器时间到了),我要处理另一个功能模块了,那么我现在执行的函数怎么处理,做现场保护?(用汇编去压栈?)汇编和C的接口怎么处理?(如IAR?)在多工序程序结构是否存在同样的问题?

使用特权

评论回复
板凳
程序匠人| | 2009-12-16 00:18 | 只看该作者
1。优先调度机制中,优先级是怎么处理的,是否是把优先级高的放在程序的主循环的前面来处理,另程序执行完优先级高的模块,怎么返回?用GOTO。

回:如果是汇编,就是用JMP。
但是如果用c,用goto当然也行,但是不符合结构化编程的思想。这个时候应该用条件判断(if)语句做嵌套,


结构一:
if (条件1)
{
  执行模块1
}
else
{
    if (条件2)
   {
        执行模块2
     }
     else
    {
         如果有更多模块,在此嵌套。。。。
     }
}


结构二:
if (条件1)
{
  执行模块1
}
else if (条件2)
{

  执行模块2
}
else if  (条件3)
  执行模块3

}
。。。。
。。。


2。时间片与分时调度机制中假如我在执行一个函数,时间到了(如定时器时间到了),我要处理另一个功能模块了,那么我现在执行的函数怎么处理,做现场保护?(用汇编去压栈?)汇编和C的接口怎么处理?(如IAR?)在多工序程序结构是否存在同样的问题?
回:如果使用时间片,必须对每个任务进行时间上的分割,确保每次执行的时间小于等于时间片的长度。这样以来,就能够确保在时间片到之前完成当前任务。

使用特权

评论回复
地板
程序匠人| | 2009-12-16 23:46 | 只看该作者
看来我的回复又石沉大海了…………

使用特权

评论回复
5
myworkmail|  楼主 | 2009-12-18 11:57 | 只看该作者
不是回复又石沉大海,是我还在啃您的书?免得我提的问题太幼稚。您的回答:我也在仔细的想。
1。优先调度机制中,结构二,还是把优先级高的放在程序的主循环中靠前面的位置来处理,优先级越低位置越后。
2。如果使用时间片,必须对每个任务进行时间上的分割,确保每次执行的时间小于等于时间片的长度。这样以来,就能够确保在时间片到之前完成当前任务。我这两天急着看了些UCOS2的书,终于明白,用操作系统的好处了,原来操作系统把现场保护和优先级的问题都给你处理好了,操作系统本生就是一个好的程序架构。

也不知道我说的对不对

使用特权

评论回复
6
myworkmail|  楼主 | 2009-12-18 12:05 | 只看该作者
欧耶!

使用特权

评论回复
7
myworkmail|  楼主 | 2009-12-18 12:13 | 只看该作者
优先调度机制,我还自己瞎想了一个,就是再加一个标志位,把执行模块分成几个档次?如:
结构二:
if(i && 0x80)
{
if (条件1)
{
  执行模块1
}
else if (条件2)
{
  执行模块2
}
else if  (条件3)
  执行模块3
}

}
if(i && 0x40)
{
if (条件1)
{
  执行模块1
}
else if (条件2)
{
  执行模块2
}
else if  (条件3)
  执行模块3
}

i是一个优先级分段标志位

使用特权

评论回复
8
myworkmail|  楼主 | 2009-12-18 12:15 | 只看该作者
还有您为什么用else if而不是if,难道else if效率高?还是什么原因
if (条件1)
{
  执行模块1
}
if (条件2)
{
  执行模块2
}
if  (条件3)
  执行模块3
}

使用特权

评论回复
9
程序匠人| | 2009-12-18 15:32 | 只看该作者
还有您为什么用else if而不是if,难道else if效率高?还是什么原因
if (条件1)
{
  执行模块1
}
if (条件2)
{
  执行模块2
}
if  (条件3)
  执行模块3
} ...
myworkmail 发表于 2009-12-18 12:15



因为你问的是“优先调度”,所以我用else if,如果是“顺序调度”那就该按你的if方式来写。二者的区别在书上已经写得明白了。请参阅书上43页的图和文字。

使用特权

评论回复
10
程序匠人| | 2009-12-18 15:35 | 只看该作者
优先调度机制,我还自己瞎想了一个,就是再加一个标志位,把执行模块分成几个档次?如:
结构二:
if(i && 0x80)
{
if (条件1)
{
  执行模块1
}
else if (条件2)
{
  执行模块2
}
else if  (条件3)
  执行模块 ...
myworkmail 发表于 2009-12-18 12:13


这里说的“优先”的概念,是指程序判断执行过程中的优先。已经通过 if……else if 结构来保证了,不需要在加标志位了吧。

使用特权

评论回复
11
程序匠人| | 2009-12-18 15:39 | 只看该作者
“这两天急着看了些UCOS2的书,终于明白,用操作系统的好处了,原来操作系统把现场保护和优先级的问题都给你处理好了,操作系统本生就是一个好的程序架构。”

回: 操作系统当然就是一个很好的调度结构。只不过,它本身需要占用一些资源。所以在实际使用是要根据具体情况决定是采用操作系统呢,还是自己造个简易的操作系统,还是干脆雪地裸奔。

使用特权

评论回复
12
myworkmail|  楼主 | 2009-12-19 00:22 | 只看该作者
谢谢.
我是else if没用过,还以为和if一样呢?else if一旦满足就跳出本次判断,从if语句开始从新判断,先是我没看懂,才会提到什么goto语句的.现在大概明白了.C语言太差了,汗一个.

使用特权

评论回复
13
myworkmail|  楼主 | 2009-12-19 00:40 | 只看该作者
我的优先级分段标志位想法是如果是程序中else if的数量太多,比如我现在写的程序就有三十几个,我只在中断中至标志位,不在中做任何数据处理.全部都在大循环中处理.如果一个一个的判断,时间太常,比如我把显示相关的都置优先级分段标志位0X80,把AD相关的置优先级分段标志位0X40,通信相关的都置优先级分段标志位0X20,时钟相关的都置优先级分段标志位0X10,既把所有的else if分成4端,这样判断时间会大大缩短

使用特权

评论回复
14
myworkmail|  楼主 | 2009-12-19 00:59 | 只看该作者
 也就是说,没次最多就判断14次而不是三十几次

使用特权

评论回复
15
程序匠人| | 2009-12-20 21:27 | 只看该作者
我的优先级分段标志位想法是如果是程序中else if的数量太多,比如我现在写的程序就有三十几个,我只在中断中至标志位,不在中做任何数据处理.全部都在大循环中处理.如果一个一个的判断,时间太常,比如我把显示相关的 ...
myworkmail 发表于 2009-12-19 00:40


我明白你的意思了。

使用特权

评论回复
16
ybzh| | 2010-1-5 13:29 | 只看该作者
回复13楼
你的方法在判断处理的过程中确实是省时间,可是你置上的标志什么时候清除呢?
这种方**在类与类之间、同类下各程序之间的调度上浪费一些资源。

使用特权

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

本版积分规则

22

主题

100

帖子

0

粉丝