打印

想了20年的一道小学生题目(奖金30元): 答案在61楼

[复制链接]
12626|107
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Cortex-M0|  楼主 | 2012-4-8 10:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Cortex-M0 于 2012-4-18 13:11 编辑

谢谢各位盆友参与讨论,结贴给分~~~

61楼 或许是最佳的折中方案,用 C  对查表的汇编代码进行了"包装", 最后就让人 "不见一行汇编代码",既满足了highgear老师的要求,不插入汇编代码,又不破坏了C代码的美感,最大程度地保留了程序的“端庄”性。



----------------------------------------------------------------- 可 爱 的 分 界 线 -----------------------------------------------------------------


上次圈圈玩了个----基于51的圈圈操作系统(51_00_OS),全程C语言编程,但在任务切换函数中,依靠插入少量汇编代码压栈保护现场,破坏了C代码的美感。

这次highgear老师,玩了个8051 下的任务调度器 OSex,思路清晰,程序精简,由于highgear老师特意不插入汇编保护哪些寄存器,因此,存在一个小小的问题,即定时函数的中断过程中,对保护哪些寄存器,在任务函数未完全确定前,是未知的,只有任务函数完全确定后,才能由Keil C51编译器自动计算出,到底使用了哪些特殊寄存器并加以压栈保护。

要对所有的特殊寄存器加以压栈保护,俺常用方法有三。

方法1:
在初始化程序中适当加入一点简短变量赋值,让Keil C51将所有压栈变量扫到位,中断就全部压栈了。

方法2:
将中断程序建库,由于和其他程序的关联让Keil C51暂时摸不清头脑,结果就将全部压栈了。

方法3:
手工添加汇编。


----------------------------------------------------------------------

评论:

方法1 增加了无关的程序长度,使得程序不够精简。

方法2 由于使用了库,使得程序可读性下降。

方法3 违背了highgear老师的意愿,插入了汇编代码,破坏了C代码的美感。


由此可见,以上这三种方法都不是最理想,因些,俺求助二姨家各路大虾牛人,有啥更好的方法,即不用插入汇编,又能对所有的特殊寄存器进行压栈保护,所写C代码要求简短易读,说实话,这一道小学生题目,俺想了20年都未解。

有个网友,一道题目想了2年,并且给出奖金300元,俺穷,给不起那么多,对帮俺解答了这一道俺想了20年的小学生题目,奖金30元~~~

相关帖子

沙发
liang7143| | 2012-4-8 15:23 | 只看该作者
;P
都是奖金惹的祸

使用特权

评论回复
板凳
Cortex-M0|  楼主 | 2012-4-9 08:20 | 只看该作者
继续求解,顶贴有分~~~  ;P

使用特权

评论回复
地板
SLEET1986| | 2012-4-9 08:38 | 只看该作者
顶帖

使用特权

评论回复
5
liang7143| | 2012-4-9 09:26 | 只看该作者
呵呵,人气不旺啊
友情帮顶

使用特权

评论回复
6
airwill| | 2012-4-9 09:41 | 只看该作者
这的确是一个难题, 不在于怎么解决, 在于最佳的效果.
本人和不赞成用库的办法. 增加了无关的程序更少令人讨厌!
所以我在做任务切换函数时, 使用的是插入了汇编代码的办法,
破坏了C代码的美感?  是啊, 我也不喜欢.
于是, 我用很精练的一个查表的汇编代码, 用 C  进行了"包装", 最后就让人 "不见一行汇编代码".

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
7
Cortex-M0|  楼主 | 2012-4-9 10:07 | 只看该作者
这的确是一个难题, 不在于怎么解决, 在于最佳的效果.
本人和不赞成用库的办法. 增加了无关的程序更少令人讨厌!
所以我在做任务切换函数时, 使用的是插入了汇编代码的办法,
破坏了C代码的美感?  是啊, 我也不喜欢.
于是, 我用很精练的一个查表的汇编代码, 用 C  进行了"包装", 最后就让人 "不见一行汇编代码".
...
airwill 发表于 2012-4-9 09:41



记得这个方法菜农比较喜欢用,俺不太喜欢~~~

尽管将汇编代码, 通过表格用 C  进行了"包装",但程序的可读性并不好,特别是这段表格的含义难于理解。

使用特权

评论回复
8
Cortex-M0|  楼主 | 2012-4-9 10:07 | 只看该作者
继续求解,顶贴有分~~~   :P

使用特权

评论回复
9
airwill| | 2012-4-9 10:29 | 只看该作者
表格是code char[],
里面的内容用宏来表达, 能够很清楚地看明白表格里的含义.

使用特权

评论回复
10
zoomone| | 2012-4-9 10:42 | 只看该作者
厚积薄发型的题目 小菜玩不了:lol

使用特权

评论回复
11
Cortex-M0|  楼主 | 2012-4-9 10:58 | 只看该作者
表格是code char[],
里面的内容用宏来表达, 能够很清楚地看明白表格里的含义.
airwill 发表于 2012-4-9 10:29



是的,这一表格菜农比较喜欢玩,每个字节代表一个机器码,如不用文字标注汇编含义,确实难看明白。

另,此表格在C语言中只能子程度(函数)调用,无法直接插入程序内运行,在本例中,要求中断过程中实时保护所有特殊寄存器,此大 法在这上可能无法应用。

使用特权

评论回复
12
airwill| | 2012-4-9 14:39 | 只看该作者
本帖最后由 airwill 于 2012-4-9 14:49 编辑

每个字节代表一个机器码, 我不是这样玩的.
code char[] 里面开始是个 0x83  的查表指令, 后面是个表格, 这个表格在任务切换中会用到(我的表格中是各任务的堆栈指针首地址, 堆栈空间, 还有 MASK 字节, 0xFE,0xFD,0xFB,0xF7,......)

然后, 用定义的宏: 如

GetBitMask(x)
GetTaskStack(task)

来 "包装"

使用特权

评论回复
13
Cortex-M0|  楼主 | 2012-4-9 14:43 | 只看该作者
能贴个简单实例吗?

学习一下,谢谢~~~ :handshake

使用特权

评论回复
14
airwill| | 2012-4-9 15:03 | 只看该作者
可以, 只是代码不在手头哦. 但是意思应该已经说明白了.

使用特权

评论回复
15
Cortex-M0|  楼主 | 2012-4-9 15:26 | 只看该作者
本帖最后由 Cortex-M0 于 2012-4-9 15:30 编辑

表格里的内容已说明清楚,但这表格如何调用?

以函数指针方式调用?

使用特权

评论回复
16
airwill| | 2012-4-9 15:40 | 只看该作者
以函数指针方式调用?  完全正确, 强制函数指针

使用特权

评论回复
17
airwill| | 2012-4-9 20:43 | 只看该作者
uint8 code Ostr[] =  {        0xEF,0x83,0xFF,0x22,                                 // 取 ROM 指令
        0xFE, 0xFD, 0xFB, 0xF7,0xEF, 0xDF, 0xBF, 0x7F,0xFF,          // ~(1<<x)
......};

#define OS_tskmsk(c) (*(uint8 (*)(uint8 ))((void *)Ostr))(c+2)


......
                Task_Running &= OS_tskmsk(Current_ID);         // 置任务非就绪态
......

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
18
Cortex-M0|  楼主 | 2012-4-10 05:46 | 只看该作者
谢谢18楼,示例不错,顶~~~

由于只能使用强制函数指针调用,无法直接插入程序内运行,在本例中,要求中断过程中实时保护所有特殊寄存器,因此,这方法可能无用武之地。

使用特权

评论回复
19
ejack| | 2012-4-10 08:02 | 只看该作者
这题目可真不简单,要兼顾代码效率、可读性、书写一致性,还要直接进行最底层操作,桎梏颇多。
我觉得无法兼顾的时候,只能权衡。对于操作系统而言效率最关键。
插入汇编或代码数组强制调用的效率更高,但是会彻底丧失可移植性,降低美感倒是其次。常见的软件项目中都会把这部分单独撇出一个文件夹,其中包含若干与硬件平台相关的汇编文件,用户根据需要自动或手动选用。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
20
Cortex-M0|  楼主 | 2012-4-10 09:24 | 只看该作者
这题目可真不简单,要兼顾代码效率、可读性、书写一致性,还要直接进行最底层操作,桎梏颇多。
我觉得无法兼顾的时候,只能权衡。对于操作系统而言效率最关键。
插入汇编或代码数组强制调用的效率更高,但是会彻底丧失可移植性,降低美感倒是其次。常见的软件项目中都会把这部分单独撇出一个文件夹,其中包含若干与硬件平台相关的汇编文件,用户根据需要自动或手动选用。 ...
ejack 发表于 2012-4-10 08:02



LS盆友太抬举俺啦~~~

这小学生题目哪有什么难度,像俺这种, 对C语言常用的几十个关键字,能写出一半就不错啦的小学生水平,都能随便抄几个关键字,随意组合一下,淘淘浆糊就能做出这道小学生题目。

二姨家高手如云,只是这个小学生题目太简单啦,高手连看都不会看一眼的。

俺实在太穷,出不起奖金几百几千,只能出30元~~~

哪位高手行行好,别整天打口水仗吸引眼球,来点实际的,帮俺解答这一道小学生题目,奖金30元~~~

使用特权

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

本版积分规则

个人签名:学习chunyang和maychang两位老师,努力练好基本功。 学习HOT大叔,学好“Cortex-M0”,做“Cortex-M0”之菜鸟。

7

主题

4820

帖子

12

粉丝