Archive for ‘尚未分类’ Category

November 4, 2009

  PIC的汇编实在诡异,有点被颠覆的感觉,原来汇编指令还可以这么来设计,原来汇编指令怎么设计都可以。最OOXX的一条指令就一个实现短转移的指令叫做BRA,意为BRAanch,看到这条指令的时候,我都诧异了,奶罩能做什么?哇塞!居然还能跳转!?奶罩居然可以无条件跳转?!Orz……另外PIC指令把单词缩写运用的淋漓尽致,譬如指令BTFSS,是一条位测试加条件跳转指令:BTFSS = Bit + Test + FileRegister + Skip + Set,用法:BTFSS R1, 0003h, 寄存器R1的第3位为1时跳过下一条指令。真是震撼!

  最后附上PIC18的中断体系硬件结构图,出自陈育斌老师的手笔:

Tags: ,. 441 views
October 27, 2009

  图示是PIC 18单片机中定时/计数器的结构图,PIC18是一种8位的单片机,但它的定时/计数器(的寄存器)却是16位的,所以为其装初值的时候就要分高低字节分别装载。于是问题就来了,由于定时计数器一般是连续工作,需要经常进行重装,如果对一个正在工作的定时计数器进行重装的话,就会产生高低字节不同步的状态,这是一种潜在的错误,尽管这种错误发生的概率很小。为了防止这种错误的发生,PIC单片机设计者采用了上图所示的双缓存结构。其中,TMR0H’和TMR0L组成了一个真正的定时计数器,而TMR0H是一个临时寄存器只有TMR0L的写信号有效时它才能被装入TMR0H’。当需要重装定时器时,首先应该将16位定时/计数的初值的高8位装入TMR0H临时寄存器,然后在向TMR0L写入低8位时由于TMR0L写信号有效,TMR0H也被同步地装入TMR0H’。这样,定时计算器就可以正确的工作,这就是硬件的双缓冲。

Tags: ,. 95 views
October 15, 2009

  下面的图片是一个LED显示屏,显示的这个等式明显是错误的,原因是某个显示屏的像点坏了,你能找出来吗?我找了10分钟,最终还是没看出来。
break dot
  答案其实并不简单……坏点……并不都是该亮的没亮,还有可能是不该亮的却亮了……

Tags: ,,. 54 views

sunset

Tags: . 35 views
September 5, 2009

  操作系统为每一个进程维护着一个虚拟的地址空间,这个地址空间的大小通常取决于系统的地址线数目,比如在32位系统中,虚拟地址空间的返回就是0×00000000~0xFFFFFFFF,大小共4G。通常操作系统会划分出一部分来专门供内核使用,而不允许用户进程直接访问。Linux内核占用4G中高地址的1G,即0XC0000000~0XFFFFFFFF,windows内核通常占用高地址的2G空间,但也可配置成1G。进程的代码、数据以及共享库等资源终究是要放在物理内存中才能被访问的,操作系统在建立用户进程时,会为其建立各自独立的虚拟地址空间,然后将各自的数据段、代码段、BSS段等映射到这个地址空间,并为其初始化堆、栈等必须的资源。另外,操作系统还将虚拟空间和物理空间都划分成大小相等的页,把进程数据所在虚拟地址空间的各个虚拟页面映射到其真正被加载的物理页面,这种映射是全相联方式的,即任何一个虚页可以被映射到任何一个实页。

Tags: ,. 32 views
September 4, 2009

  上PIC课讲到信号监测时,老师做过这样一个比喻:说同学们,10分钟后咱们到教室外面集合,对于“查询式”同学,他会不停地数数,直到600,“中断式“会定一个闹表,当然啦,我可以该干嘛干嘛,大家都走了我再走,多省资源啊哈哈!

  话说今儿晚上在运动常跑步,遇到一查询式的哥们儿。我跑第一圈从他身边经过,冲我问:
  - 几点啦?
  - ……八点半……
  - 三十几?
  - ……三十四……
  - 四十四?四十四还是三十四?
  - …………我无语……继续跑……
  又问:
  -哎哥们儿,几点了?
  -三十五!

  若干圈之后,
  -嗨美女,几点了?
  -没带表!

  第八圈,
  -A,几点了?
  -9点。
  -哦……

  啊然后这哥们儿从跑道边栏杆上摘下一个包,把手机掏出来,走出运动场……

Tags: ,. 9 views
August 17, 2009
Linux Air

对其它所有航空公司都不满的员工决定离开他们自己的航空公司。他们开始自己建造飞机,机票柜台,以及自己铺设飞机跑道。他们只用很少的费用给你提供可打印的机票,但你完全可以自己下载下来打印机票。

当你登机的时候,会有人递给你一个座位,四个螺栓,一个扳手和一本“安装座位-HOWTO.html”手册。一但安装好了,可随意调整或更改的座位可能让你相当地舒服,从飞机离开到目的地,其几乎不会发生一个错误,而且,飞机过程中的飞行餐非常不错。你会想去告诉选乘别的航空公司的乘客你那完美的经历,但你所能得到的回答是,“乘座飞机还要必需要去安装自己的座位?”。

Tags: . 26 views
August 14, 2009
我能抽象出整个世界...
但是我不能抽象出你...
因为你在我心中是那么的具体...
所以我的世界并不完整...
我可以重载甚至覆盖这个世界里的任何一种方法...
但是我却不能重载对你的思念...
也许命中注定了 你在我的世界里永远的烙上了静态的属性...
而我不慎调用了爱你这个方法...
当我义无返顾的把自己作为参数传进这个方法时...
我才发现爱上你是一个死循环...
它不停的返回对你的思念压入我心里的堆栈...
在这无尽的黑夜中...
我的内存里已经再也装不下别人...
我不停的向系统申请空间...
但却捕获一个异常---我爱的人不爱我...
为了解决这个异常...
我愿意虚拟出最后一点内存...
把所有我能实现的方法地址压入堆栈...
并且在栈尾压入最后一个方法---将字符串"我爱你,你爱我吗?"传递给你...
如果返回值为真--我将用尽一生去爱你...
否则--我将释放掉所有系统资源
Tags: ,,,. 19 views
July 29, 2009

如果两个或多个进程永久等待某个事件而该事件只能由这些等待进程的某一个引起,那么死锁就会发生。死锁的发生需要满足四个必要条件:

  • 互斥:资源的互斥访问,没有互斥就不会产生死锁;
  • 占有并等待:某个进程占有了一定资源,并且因无法得到其他资源而等待;
  • 非抢占:某个进程所占有的资源,不允许被其他进程抢占;
  • 循环等待:对于进程序列{P0, p1, …… , Pi, Pi+1, ……, Pn},Pi在等待Pi+1所占有的资源,P0占有了Pn需要的资源;
Tags: . 9 views
July 27, 2009

多线程程序的各线程通常会共享某些资源,比如代码、文件、数据等,这些被共享的资源通常会成为临界资源。各线程访问临界资源的代码区段称作临界区,临界区代码的执行应该是互斥的,否则可能造成错误的行为。解决临界区问题的算法必须满足三个条件:

  • 互斥:临界区的访问应该是互斥进行的;
  • 有空让进:若没有线程的其临界区执行,则应该允许一个或者多个线程请求(进入区)进入其临界区;
  • 有限等待:任何线程都不能霸占临界区,即持续访问临界区的时间或者次数应该有一个上限;

下面的这段代码简易地实现了两个线程互斥地访问临界资源(std::string Critical),可以证明,其满足上述三个条件。

Tags: . 10 views
Page 3 of 512345