打印

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

[复制链接]
楼主: Cortex-M0
手机看帖
扫描二维码
随时随地手机跟帖
61
……这坛里的奇人异士,前辈绝对算一个……
ejack 发表于 2012-4-11 07:52


能算“西毒”吧

使用特权

评论回复
62
laoxu| | 2012-4-18 07:10 | 只看该作者
呵呵,高手都很忙,没空,俺来解一下吧~~~


根据 33楼:highgear老师的理论

一个简单的方法是:在中断中嵌入一句汇编,比如 nop. 此时, Keil 会把所有 context register (r0-r7,A,B,dptr,psw)push/pop.  ...
highgear 发表于 2012-4-11 21:58


得出结论,只要在中断中嵌入一句汇编,Keil 会把所有的 context register (r0-r7,A,B,dptr,psw)push/pop 。





再根据 6楼:airwill老师的理论

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


得出结论,可用很精的一个查表的汇编代码, 用 C  进行了"包装", 最后就让人 "不见一行汇编代码"。



将两位老师的经典之作,组合在一起,就能完成这一道小学生题目。

并且中断C函数不用单独列出,写成一个单独的模块,可在任何模块中,随时按需指定调用,适用于任何版本的 Keil C51。


DEMO程序如下:

typedef  void (* TaskCallback)(  );

code  char  protection[1] = {0x22};    // RET 返回

void  timer0(  )  interrupt  0
{
    ……
    (*((TaskCallback) protection))(  );
    ……
}

使用特权

评论回复
63
laoxu| | 2012-4-18 07:12 | 只看该作者
DEMO程序测试图:








下图可看出,中断调用一个空函数返回,仅占一个字节 FLASH 。


使用特权

评论回复
64
海川先生| | 2012-4-18 08:30 | 只看该作者
围观中

使用特权

评论回复
65
Cortex-M0|  楼主 | 2012-4-18 13:09 | 只看该作者
谢谢各位盆友参与讨论,结贴给分~~~

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

使用特权

评论回复
66
aihe| | 2012-4-18 20:28 | 只看该作者
:lol

使用特权

评论回复
67
刘前辈| | 2012-4-18 21:48 | 只看该作者
一个简单的方法是:在中断中嵌入一句汇编,比如 nop. 此时, Keil 会把所有 context register (r0-r7,A,B,dptr,psw)push/pop.  ...
highgear 发表于 2012-4-11 21:58

这回是所长第一个发现并公布的,所长老大获奖,俺做无名研究:还需付所长使用费。







、、

使用特权

评论回复
68
李富贵| | 2012-4-18 22:00 | 只看该作者
都是吃饱了撑的,有时间研究点新技术不好,精通这些雕虫小技能涨工资不成?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
69
Cortex-M0|  楼主 | 2012-4-19 03:19 | 只看该作者
66楼 打开了 SRC

指定插入汇编 __asm

算作毙  :lol

使用特权

评论回复
70
刘前辈| | 2012-4-19 12:47 | 只看该作者
本帖最后由 刘前辈 于 2012-4-19 12:50 编辑

哈哈,女版主这水平真逗:编译器确实产生了INT.SRC文件,可是根本没有调用汇编器A51.exe 汇编它 !     连接文件 INT.OBJ  仍然是C51编译器编译结果,打开的INT.SRC是项目以外的冗余文件,与项目文件无关!——照女版主说法,程序员不关心的项目以外的冗余文件多了,统统不合理?——你顾得过来么?

         很简单的证实方法: 把C51\BIN\A51.exe 删除或改名,编译仍然通过。打开不打开SRC对 INT.C 编译结果没有任何影响。




、、

使用特权

评论回复
71
troview| | 2012-4-19 12:57 | 只看该作者
以函数指针方式调用?

使用特权

评论回复
72
Cortex-M0|  楼主 | 2012-4-19 13:04 | 只看该作者
以函数指针方式调用?
troview 发表于 2012-4-19 12:57



是函数指针方式调用。

使用特权

评论回复
73
刘前辈| | 2012-4-19 16:30 | 只看该作者
本帖最后由 刘前辈 于 2012-4-19 16:32 编辑

没事,再来一个不用打开SRC的。这是通过配置告诉编译器的,没有使用关键字__asm , 不产生SRC文件。






、、

使用特权

评论回复
74
laoxu| | 2012-4-19 18:57 | 只看该作者
顶一个

使用特权

评论回复
75
Cortex-M0|  楼主 | 2012-4-19 19:12 | 只看该作者
72楼:确实吃饱饭没事干,又来周老虎那一套了,散会,无语~~~


下列图片引用 72楼




使用特权

评论回复
76
Cortex-M0|  楼主 | 2012-4-19 19:16 | 只看该作者
任何实验,都需要列出方法,让其他网友能克隆照抄验证通过。

否则,跟周老虎PS一下图片,没啥两样~~~

您老留着慢慢玩吧,俺没兴趣~~~

使用特权

评论回复
77
Alan.Z| | 2012-4-19 19:27 | 只看该作者
顶下,支持楼主!

使用特权

评论回复
78
Cortex-M0|  楼主 | 2012-4-19 21:12 | 只看该作者
引用 72楼图片 和 66楼图片 对比一下~~~








使用特权

评论回复
79
aihe| | 2012-4-19 22:44 | 只看该作者
耍小把戏戏上不了台面的,别把自己当刘谦

使用特权

评论回复
80
Cortex-M0|  楼主 | 2012-4-20 05:33 | 只看该作者
LS盆友马桥的?

这两天要去车墩发货,路过马桥,不知aihe是否有空,一起吃个饭?

使用特权

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

本版积分规则