免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 怪怪虎
打印 上一主题 下一主题

汇编指令和时序电路的关系? [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
11 [报告]
发表于 2009-12-29 13:41 |只看该作者
原帖由 怪怪虎 于 2009-12-29 13:30 发表


都给讲到这个份上了,看来自己不明白只能看驱动的code了. 哈哈
可是现在基于linux操作系统的驱动,在书写方式上,个人感觉他把底层的实现都给隐藏了. 在c语言code里看到的只是一些设备逻辑,根本看不出"协议 ...

呵呵,你用C语言看不出来的话,你用汇编一样看不出来,打个比方
*(volatile unsigned*)(0x0d000000) = 1
换成汇编假如长这样:
mov r1,0x0d000000
mov *r1,0x1
你能通过这样的语句知道处理器是如何控制各信号线的吗?
你还是看不出来.
或者,你还没有明白什么是协议.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
12 [报告]
发表于 2009-12-29 13:50 |只看该作者
原帖由 cjaizss 于 2009-12-29 13:41 发表

呵呵,你用C语言看不出来的话,你用汇编一样看不出来,打个比方
*(volatile unsigned*)(0x0d000000) = 1
换成汇编假如长这样:
mov r1,0x0d000000
mov *r1,0x1
你能通过这样的语句知道处理器是如何控制各信号 ...

另外,协议要参照的不是代码,而是manual,datasheet!!!
我把我最近使用的一个硬件的硬件驱动部分代码节选一下给你看下

  1. /*
  2. *      Using MDC/MDIO
  3.          PC4    MDC
  4.          PC5    MDIO
  5. */
  6. #ifdef IN
  7. #undef IN
  8. #endif
  9. #ifdef OUT
  10. #undef OUT
  11. #endif
  12. #define IN      0x0
  13. #define OUT     0x1
  14. #define SETMDC(x) ({PDATD=(PDATD&(~(0x1<<6)))|(((unsigned)(x))<<6);})
  15. #define SETMDIO(x)      (PDATD=(PDATD&(~(0x1<<7)))|(((unsigned)(x))<<7))
  16. #define GETMDIO()       ((PDATD&(0x1<<7))>>7)
  17. #define SETMDIOMOD(x)   ({PCOND = (PCOND & (~(0x3<<14))) | ((x)<<14);}) /*****x is IN or OUT*******/

  18. #define RD_MDIO1(addr)  ({                      \
  19.                 int j;                          \
  20.                 register unsigned short x;      \
  21.                 x=addr;                         \
  22.                 SETMDIOMOD(OUT);                \
  23.                 SETMDIO(1);                     \
  24.                 for(j=0;j<32;j++) {             \
  25.                         SETMDC(0);              \
  26.                         SETMDC(1);              \
  27.                 }                               \
  28.                 /****ST!01******/               \
  29.                 SETMDC(0);                      \
  30.                 SETMDIO(0);                     \
  31.                 SETMDC(1);                      \
  32.                 SETMDC(0);                      \
  33.                 SETMDIO(1);                     \
  34.                 SETMDC(1);                      \
  35.                 /***OP!10=READ*******/          \
  36.                 SETMDC(0);                      \
  37.                 /*SETMDIO(1);*/                 \
  38.                 SETMDC(1);                      \
  39.                 SETMDC(0);                      \
  40.                 SETMDIO(0);                     \
  41.                 SETMDC(1);                      \
  42.                 /***PHYAD!11110*****/           \
  43.                 SETMDC(0);                      \
  44.                 SETMDIO(1);                     \
  45.                 SETMDC(1);                      \
  46.                 SETMDC(0);                      \
  47.                 SETMDC(1);                      \
  48.                 SETMDC(0);                      \
  49.                 SETMDC(1);                      \
  50.                 SETMDC(0);                      \
  51.                 SETMDC(1);                      \
  52.                 SETMDC(0);                      \
  53.                 SETMDIO(0);                     \
  54.                 SETMDC(1);                      \
  55.                 /***REGAD**********/            \
  56.                 SETMDC(0);                      \
  57.                 SETMDIO((x&(0x1<<4))>>4);       \
  58.                 SETMDC(1);                      \
  59.                 SETMDC(0);                      \
  60.                 SETMDIO((x&(0x1<<3))>>3);       \
  61.                 SETMDC(1);                      \
  62.                 SETMDC(0);                      \
  63.                 SETMDIO((x&(0x1<<2))>>2);       \
  64.                 SETMDC(1);                      \
  65.                 SETMDC(0);                      \
  66.                 SETMDIO((x&(0x1<<1))>>1);       \
  67.                 SETMDC(1);                      \
  68.                 SETMDC(0);                      \
  69.                 SETMDIO(x&0x1);         \
  70.                 SETMDC(1);                      \
  71.                 /*****TA********/               \
  72.                 SETMDIOMOD(IN);/**?**/          \
  73.                 SETMDC(0);                      \
  74.                 SETMDC(1);                      \
  75.                 SETMDC(0);                      \
  76.                 SETMDC(1);                      \
  77.                 /*****DATA******/               \
  78.                 x=0;                            \
  79.                 SETMDC(0);                      \
  80.                 x |= GETMDIO()<<15;             \
  81.                 SETMDC(1);                      \
  82.                 SETMDC(0);                      \
  83.                 x |= GETMDIO()<<14;             \
  84.                 SETMDC(1);                      \
  85.                 SETMDC(0);                      \
  86.                 x |= GETMDIO()<<13;             \
  87.                 SETMDC(1);                      \
  88.                 SETMDC(0);                      \
  89.                 x |= GETMDIO()<<12;             \
  90.                 SETMDC(1);                      \
  91.                 SETMDC(0);                      \
  92.                 x |= GETMDIO()<<11;             \
  93.                 SETMDC(1);                      \
  94.                 SETMDC(0);                      \
  95.                 x |= GETMDIO()<<10;             \
  96.                 SETMDC(1);                      \
  97.                 SETMDC(0);                      \
  98.                 x |= GETMDIO()<<9;              \
  99.                 SETMDC(1);                      \
  100.                 SETMDC(0);                      \
  101.                 x |= GETMDIO()<<8;              \
  102.                 SETMDC(1);                      \
  103.                 SETMDC(0);                      \
  104.                 x |= GETMDIO()<<7;              \
  105.                 SETMDC(1);                      \
  106.                 SETMDC(0);                      \
  107.                 x |= GETMDIO()<<6;              \
  108.                 SETMDC(1);                      \
  109.                 SETMDC(0);                      \
  110.                 x |= GETMDIO()<<5;              \
  111.                 SETMDC(1);                      \
  112.                 SETMDC(0);                      \
  113.                 x |= GETMDIO()<<4;              \
  114.                 SETMDC(1);                      \
  115.                 SETMDC(0);                      \
  116.                 x |= GETMDIO()<<3;              \
  117.                 SETMDC(1);                      \
  118.                 SETMDC(0);                      \
  119.                 x |= GETMDIO()<<2;              \
  120.                 SETMDC(1);                      \
  121.                 SETMDC(0);                      \
  122.                 x |= GETMDIO()<<1;              \
  123.                 SETMDC(1);                      \
  124.                 SETMDC(0);                      \
  125.                 x |= GETMDIO();                 \
  126.                 SETMDC(1);                      \
  127.                 /*******IDLE****/               \
  128.                 SETMDIOMOD(OUT);                \
  129.                 SETMDIO(1);                     \
  130.                 for(j=0;j<1;j++) {              \
  131.                         SETMDC(0);              \
  132.                         SETMDC(1);              \
  133.                 }                               \
  134.                 x;                              \
  135.                 })

  136. #define WR_MDIO(addr,value)     ({              \
  137.                 int j;                          \
  138.                 register unsigned short x;      \
  139.                 SETMDIOMOD(OUT);                \
  140.                 /****ST!01******/               \
  141.                 SETMDC(0);                      \
  142.                 SETMDIO(0);                     \
  143.                 SETMDC(1);                      \
  144.                 SETMDC(0);                      \
  145.                 SETMDIO(1);                     \
  146.                 SETMDC(1);                      \
  147.                 /***OP!01=WRITE*******/         \
  148.                 SETMDC(0);                      \
  149.                 SETMDIO(0);                     \
  150.                 SETMDC(1);                      \
  151.                 SETMDC(0);                      \
  152.                 SETMDIO(1);                     \
  153.                 SETMDC(1);                      \
  154.                 /***PHYAD!11110*****/           \
  155.                 SETMDC(0);                      \
  156.                 SETMDIO(1);                     \
  157.                 SETMDC(1);                      \
  158.                 SETMDC(0);                      \
  159.                 SETMDC(1);                      \
  160.                 SETMDC(0);                      \
  161.                 SETMDC(1);                      \
  162.                 SETMDC(0);                      \
  163.                 SETMDC(1);                      \
  164.                 SETMDC(0);                      \
  165.                 SETMDIO(0);                     \
  166.                 SETMDC(1);                      \
  167.                 /***REGAD**********/            \
  168.                 SETMDC(0);                      \
  169.                 x=addr;                         \
  170.                 SETMDIO((x&(0x1<<4))>>4);       \
  171.                 SETMDC(1);                      \
  172.                 SETMDC(0);                      \
  173.                 SETMDIO((x&(0x1<<3))>>3);       \
  174.                 SETMDC(1);                      \
  175.                 SETMDC(0);                      \
  176.                 SETMDIO((x&(0x1<<2))>>2);       \
  177.                 SETMDC(1);                      \
  178.                 SETMDC(0);                      \
  179.                 SETMDIO((x&(0x1<<1))>>1);       \
  180.                 SETMDC(1);                      \
  181.                 SETMDC(0);                      \
  182.                 SETMDIO(x&0x1);         \
  183.                 SETMDC(1);                      \
  184.                 /*****TA********/               \
  185.                 /*SETMDIOMOD(IN);*//**?**/      \
  186.                 SETMDC(0);                      \
  187.                 SETMDIO(1);                     \
  188.                 SETMDC(1);                      \
  189.                 SETMDC(0);                      \
  190.                 SETMDIO(0);                     \
  191.                 SETMDC(1);                      \
  192.                 /*****DATA******/               \
  193.                 /*SETMDIOMOD(OUT);*/            \
  194.                 x=value;                        \
  195.                 SETMDC(0);                      \
  196.                 SETMDIO((x&((0x1)<<15))>>15);   \
  197.                 SETMDC(1);                      \
  198.                 SETMDC(0);                      \
  199.                 SETMDIO((x&((0x1)<<14))>>14);   \
  200.                 SETMDC(1);                      \
  201.                 SETMDC(0);                      \
  202.                 SETMDIO((x&((0x1)<<13))>>13);   \
  203.                 SETMDC(1);                      \
  204.                 SETMDC(0);                      \
  205.                 SETMDIO((x&((0x1)<<12))>>12);   \
  206.                 SETMDC(1);                      \
  207.                 SETMDC(0);                      \
  208.                 SETMDIO((x&((0x1)<<11))>>11);   \
  209.                 SETMDC(1);                      \
  210.                 SETMDC(0);                      \
  211.                 SETMDIO((x&((0x1)<<10))>>10);   \
  212.                 SETMDC(1);                      \
  213.                 SETMDC(0);                      \
  214.                 SETMDIO((x&((0x1)<<9))>>9);     \
  215.                 SETMDC(1);                      \
  216.                 SETMDC(0);                      \
  217.                 SETMDIO((x&((0x1)<<8))>>8);     \
  218.                 SETMDC(1);                      \
  219.                 SETMDC(0);                      \
  220.                 SETMDIO((x&((0x1)<<7))>>7);     \
  221.                 SETMDC(1);                      \
  222.                 SETMDC(0);                      \
  223.                 SETMDIO((x&((0x1)<<6))>>6);     \
  224.                 SETMDC(1);                      \
  225.                 SETMDC(0);                      \
  226.                 SETMDIO((x&((0x1)<<5))>>5);     \
  227.                 SETMDC(1);                      \
  228.                 SETMDC(0);                      \
  229.                 SETMDIO((x&((0x1)<<4))>>4);     \
  230.                 SETMDC(1);                      \
  231.                 SETMDC(0);                      \
  232.                 SETMDIO((x&((0x1)<<3))>>3);     \
  233.                 SETMDC(1);                      \
  234.                 SETMDC(0);                      \
  235.                 SETMDIO((x&((0x1)<<2))>>2);     \
  236.                 SETMDC(1);                      \
  237.                 SETMDC(0);                      \
  238.                 SETMDIO((x&((0x1)<<1))>>1);     \
  239.                 SETMDC(1);                      \
  240.                 SETMDC(0);                      \
  241.                 SETMDIO(x&0x1);                 \
  242.                 SETMDC(1);                      \
  243.                 /*******IDLE****/               \
  244.                 SETMDIO(1);                     \
  245.                 for(j=0;j<1;j++) {              \
  246.                         SETMDC(0);              \
  247.                         SETMDC(1);              \
  248.                 }                               \
  249.                 })

  250. int read_MDC_MDIO_reverse(unsigned char page,unsigned char addr,unsigned char*dest,int len)
  251. {
  252.         unsigned short tmp;
  253.         int i;
  254.         tmp = 0x01 | (((unsigned short)page)<<8);
  255.         WR_MDIO(16,tmp);
  256.         tmp = 0x02 | (((unsigned short)addr)<<8);
  257.         WR_MDIO(17,tmp);
  258.         while(1) {
  259.                 tmp = RD_MDIO(17);
  260.                 if((tmp & 0x3) == 0)
  261.                         break;
  262.         }
  263.         for(i=len;i>0;i-=2) {
  264.                 tmp = RD_MDIO(23+i/2);
  265.                 dest[0] = tmp>>8;
  266.                 dest[-1] = tmp;
  267.                 dest -= 2;
  268.         }
  269.         return 0;
  270. }

  271. int write_MDC_MDIO(unsigned char page,unsigned char addr,const unsigned char*src,int len)
  272. {
  273.         unsigned short tmp;
  274.         int i;
  275.         tmp = 0x01 | (((unsigned short)page)<<8);
  276.         WR_MDIO(16,tmp);
  277.         for(i=0;i<len;i+=2) {
  278.                 tmp = (unsigned short)src[0]<<8;
  279.                 if(i != len-1)
  280.                         tmp |= (unsigned short)src[1];
  281.                 WR_MDIO(24+i/2,tmp);
  282.                 src += 2;
  283.         }
  284.         tmp = 0x01 | (((unsigned short)addr)<<8);
  285.         WR_MDIO(17,tmp);
  286.         while(1) {
  287.                 tmp = RD_MDIO(17);
  288.                 if((tmp & 0x3) == 0)
  289.                         break;
  290.         }
  291.         return 0;
  292. }
复制代码

咱就没有整明白了,它怎么就屏蔽了实现了.

[ 本帖最后由 cjaizss 于 2009-12-30 09:17 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2009-12-29 14:06 |只看该作者
原帖由 cjaizss 于 2009-12-29 13:41 发表

呵呵,你用C语言看不出来的话,你用汇编一样看不出来,打个比方
*(volatile unsigned*)(0x0d000000) = 1
换成汇编假如长这样:
mov r1,0x0d000000
mov *r1,0x1
你能通过这样的语句知道处理器是如何控制各信号 ...


看来是后者(协议)没理解好.
我有重新整理了下思路.
由于器件的可编程性,我们索性就通过配置寄存器来设置某款芯片使用的"协议". (多个寄存器的不同配置共同构成了某个芯片的协议).
在软件中,对硬件的访问也只可能通过寄存器的访问.
在你给的例子中,0x0d000000应该是对应某个寄存器的地址吧.

我的这个理解没错吧.请指教.^_^

论坛徽章:
0
14 [报告]
发表于 2009-12-29 14:10 |只看该作者
不知道你学过计算机网络没

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
15 [报告]
发表于 2009-12-29 14:16 |只看该作者
原帖由 怪怪虎 于 2009-12-29 14:06 发表


看来是后者(协议)没理解好.
我有重新整理了下思路.
由于器件的可编程性,我们索性就通过配置寄存器来设置某款芯片使用的"协议". (多个寄存器的不同配置共同构成了某个芯片的协议).
在软件中,对硬件的访问 ...

这个认识也不一定对.
协议其实就是一规范,双方依照这规范办事即可.
完整的协议可能是用小的协议搭建起来的.
比如localbus是一套协议,你采用localbus配置寄存器以完成一个功能,这也是一个协议,但这个协议是建立在localbus之上的.
再者,我刚才贴的代码本身就是一个读写某IC的寄存器的协议.

论坛徽章:
0
16 [报告]
发表于 2009-12-29 14:44 |只看该作者
原帖由 自由建客 于 2009-12-29 14:10 发表
不知道你学过计算机网络没


学过,愿问其详.
PS.
难道你想套用网络里的协议?虽然他们存在着某些相似点, 我个人认为网络里的协议和这里要实现的协议,有一定的差距.(个人观点)

[ 本帖最后由 怪怪虎 于 2009-12-29 14:47 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2009-12-29 14:46 |只看该作者
原帖由 cjaizss 于 2009-12-29 14:16 发表

这个认识也不一定对.
协议其实就是一规范,双方依照这规范办事即可.
完整的协议可能是用小的协议搭建起来的.
比如localbus是一套协议,你采用localbus配置寄存器以完成一个功能,这也是一个协议,但这个协议是 ...


先出去几个小时,回来在接着看.感觉你的引导,让我在逐渐的了解这个咚咚, 先谢谢 ^_^.

论坛徽章:
0
18 [报告]
发表于 2009-12-29 22:14 |只看该作者
原帖由 cjaizss 于 2009-12-29 13:50 发表

另外,协议要参照的不是代码,而是manual,datasheet!!!
我把我最近使用的一个硬件的硬件驱动部分代码节选一下给你看下

/*
*      Using MDC/MDIO
         PC4    MDC
         PC5    MDIO
*/
#ifde ...


以前确实没见过这样的驱动code,(太菜了). 坦白的说,没有看出code(#define RD_MDIO1和#define WR_MDIO)怎样驱动硬件来. 从code的注释看,好像是按照某种"协议"在做事请.
*****ST!01***
*****OP!10***
*****PHYAD***
*****REGAD***
*****TA******
*****DATA****
也许看了硬件手册后,才能清楚些. (准备找个硬件datasheet学习下)

另外,时序和指令应该没有太大的关系.
时序电路是固定的. cpu只会在某个时钟的上升沿或者下降沿读取/执行指令.  (以前老是认为不同的指令对应着不同的时序)

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
19 [报告]
发表于 2009-12-30 09:19 |只看该作者
原帖由 怪怪虎 于 2009-12-29 22:14 发表


以前确实没见过这样的驱动code,(太菜了). 坦白的说,没有看出code(#define RD_MDIO1和#define WR_MDIO)怎样驱动硬件来. 从code的注释看,好像是按照某种"协议"在做事请.
*****ST!01***
*****OP!10***
**** ...

这个与硬件设计有关,恕我不能把这些给你,不过我可以给你一些例子.
用gpio来模拟硬件接口协议的例子.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
20 [报告]
发表于 2009-12-30 09:32 |只看该作者
打个比方吧,你可以使用GPIO模拟一个IIC吗?
IIC你可以参照
http://www.mcufan.com/xinshou/mcu-iic.htm
SCL和SDA两根线通信.
SCL和SDA接的都是处理器上的GPIO
假设我已经实现好
SETSCL(x)
SETSDA(x)
GETSCL()
GETSDA()
SETSCLMOD(x)/*IN or OUT*/
SETSDAMOD(x)/*IN or OUT*/

[ 本帖最后由 cjaizss 于 2009-12-30 09:53 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP