参考:http://www.zeitoun.net/articles/comet_and_php/start
一、基于AJAX轮询方式与传统AJAX方式的区别:

    1. 服务器端会阻塞请求直到有数据传递或超时才返回。
    2. 客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
    3. 当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。

    采用这种方式实现的技术有meboo和pushlet chat。

二、基于iframe及htmlfile流的方式

    这个方式和AJAX方式原理相同,只是浏览器一直会显示正在连接状态,gtalk采用htmlfile技术解决了此问题。Zeitoun 网站提供的 comet-iframe.tar.gz,封装了一个基于 iframe 和 htmlfile 的 JavaScript comet 对象,支持 IE、Mozilla Firefox 浏览器,可以作为参考:http://www.zeitoun.net/articles/comet_and_php/start

三、Http长连接的编程原则

    1、不要在同一个客户端开启超过两个的http长连接,这个是受http协议限制的。
    2、控制信息和数据信息使用不同的http连接。
    3、在客户端和服务器端保持“心跳”信息。

四、Pushlet框架学习

    Pushlet框架是用后台采用java实现,前台技术有AJAX和Iframe两种。设计思想采用观察者模式。


点击在新窗口中浏览此图片
所谓Push Mail,全称应该是Server Push Email。顾名思义,即邮件到达服务器后,由服务器主动将邮件推送到用户的接收终端上(比如手机)。而像我们使用的Outlook等邮件客户端的收取邮件行为,是典型的Client Pull Mail模式,即客户端主动收取邮件,这实际上是需要用户干预操作的。如此一来,Push Mail的优势就不言而喻了——它不需要用户进行任何干涉,可以由服务器自动将邮件推送到用户手机,简单来说就是方便。
和一以前毕业实习的公司现在在雅虎的同事聊天:
回忆未来  11:29:11
你们做的啥,给个链接让我瞧瞧。
扬东  11:29:14
好好干,
回忆未来  11:29:28
给个链接让我瞧瞧
扬东  11:29:34
http://bbs.koubei.com/
http://ask.koubei.com/
扬东  11:29:43
这两个现在都我一个人。
回忆未来  11:30:13
上司是个大色狼我该怎么办? 呵呵,就搞这些玩意,唉,不过我喜欢。
回忆未来  11:30:29
很厉害喔你,呵呵呵
回忆未来  11:33:30
雅虎没你不行了喔,呵呵。
扬东  11:33:46
呵呵,
回忆未来  11:33:57
我没事来瞅瞅,给你加人气哈。
扬东  11:34:14
好,
回忆未来  11:34:15
里面的东西还真吸引我,以前咋就没有注意呢?哈哈
扬东  11:34:22
呵呵,

Atmel公司的AVR系列单片机是一种性能优良, 耗电很小的微控制器, 他的主要特点是:
1). 单时钟周期指令;
2). 很高的C语言编码效率;
3). 支持在系统编程(ISP)技术.
AVR单片机是我目前在Linux下看到的开发工具最全的微控制器, 它的开发非常方便, 从此我们在Linux下也可以开发单片机了.
开发AVR的编译器是gcc, 实际上就是给gcc加上适合于AVR的库, 该库的名字叫avr-libc, 目前支持的开发语言是c和c++, c++的支持还在开发中. 下面就介绍AVR-GCC的安装方法并简单介绍一下通用编程器uisp的安装方法.
当前avr-libc仍在不断的进行中, 该项目的主页是 http://www.nongnu.org/avr-libc , 该页面上面还有很多AVR在Linux下开发的辅助工具, 本文就不介绍了. avr-gcc的下载地址是: http://savannah.nongnu.org/download/avr-libc/snapshots/src , 请下载binutils-030428.tar.bz2 , gcc-core-20030428.tar.bz2 , gcc-g++-20030428.tar.bz2 , avr-libc-20030422cvs.tar.gz. 以root用户登录, 将它们拷贝到安装目录中(我的习惯是/usr/local/src), 解压缩软件包:
bunzip2 *.bz2
tar xvf *.tar
tar zxvf *.tar.gz
之后会在安装目录中生成`三个子目录, binutils-030438/ , gcc-20030428/ , avr-libc-20030422cvs/ . 下面分别安装之.
安装binutils:
cd binutils-030428/
./configure --target=avr --prefix=/usr/local/atmel (/usr/local/atmel是安装目录)
make
make install
然后在/etc/ld.so.conf中加入/usr/local/atmel/lib一行, 并运行/sbin/ldconfig更新.
在~/.bashrc文件中加入export PATH=/usr/local/atmel/bin:${PATH}, 并且在命令行下也输入该语句.
安装gcc:
cd gcc-20030428/
./configure --target=avr --prefix=/usr/local/atmel --disable-nls --enable-language=c,c++
make
make install
安装avr-libc:
先设置一些环境变量:
export CC=avr-gcc; export AS=avr-as; export AR=avr-ar; export RANLIB=avr-ranlib
export PATH=/usr/local/atmel/bin:${PATH}; export PREFIX=/usr/local/atmel
./reconf
./doconf
./domake
cd build
make install
如果一切顺利的话, AVR-GCC就安装完成了.
下面介绍通用编程器uisp的安装
uisp是一个通用的编程器, 用来在Linux下控制各种各样的编程器, 该项目正在不断的完善中, 项目的主页是:
http://savannah.nongnu.org/projects/uisp
从上面下载uisp-20021201.tar.gz
解压缩:
tar zxvf uisp-20021201.tar.gz
开始安装:
cd uisp-20021201/
./configure
make
make install
这样uisp也装好了. 运行之前我们还要作些准备工作. 运行lsmod命令, 看列表中有没有parport, parport_pc, ppdev 三个模块, 有的话就跳过下面一段.
编译内核, 确信选中parallel port support -> parallel support 和 parallel port support -> pc-style hardware 及 Character devices -> Support for user-space parallel port device drivers 三项. 编译好内核后, 进入/lib/modules/<内核版本号>/kernel/drivers/parport/ , 运行 insmod parport.o ; insmod parport_pc.o ; cd .. ; cd char/ ; insmod ppdev.o , 可以将加载模块的命令加入rc.sysinit, 这样就不用以后再手工输入了.
下面简单讲讲avr-gcc和uisp的使用方法, 详细的handbook我会以后翻译. 假定mcu为at90s8515, 源程序为avr.c .
1). 编译C源程序
生成.o文件: avr-gcc -mmcu=at90s8515 -Os avr.c
生成.out文件: avr-gcc -mmcu=at90s8515 -o -Wl,-Map,avr.map avr.o avr.out
生成.hex文件: avr-objcopy -R .eeprom -O ihex avr.out avr.hex
2). 在线下载
刷新: uisp -dlpt=/dev/parport0 --erase -dprog=dapa
编程: uisp -dlpt=/dev/parport0 --upload if=avr.hex -dprog=dapa -dno-poll -v=3 --hash=32
3). 下载线
PC 并口 AVR
Init (Pin 16) -> Reset
D0 (Pin 2) -> MOSI
Busy(Pin 11) -> MISO
Strobe(Pin 1) -> SCK
GND(Pin 18) -> GND
注意:
引线要串1K的电阻, AVR的Reset端接10K的上拉, 要给单片机3-5V的外部供电.
最后祝大家都能顺利的使用Linux开发AVR.
有问题与我联系 (cuijianw@etang.com)


问:
答:软件包?首先你用什么linux?一般性的ubuntu之类的,都可以直接用avr-gcc来搞~avr-gcc,如果是debian或者ubuntu可以直接apt-get
阅读全文
原来想的是用一个对列来调用一个播放器进行温度报警和系统的状态检查啥的,最后没有想到还是得用Mplayer的播放列表来做,于是就涉及到把某个$HOME/music下的歌,都制作成一个播放列表,怎么做?还有就是一旦我有了播放列表,怎么随意添加 或删除其中的一些歌?

$ ls $HOME/music > music.lst
添加
echo music.mp3 >> music.lst
删除
用编译器打开music.lst删除你想删除的
播放
$ mplayer -playlist music.lst #也有可能是mplayer --playlist music.lst,记不清啦,自己看一下mplayer --help
有了这样一个基础,那么就可以通过程序去自动构造播放列表了!!!
附加信息:
linux 下mplayer播放列表制作的一个方法

   在终端如果输入 mplayer xxx.mp3 就会播放了,输入 mplayer /.../* 就可以播放这个路径下的所有支持的多媒体文件了,为了省去每次都输入绝对路径的麻烦,可以制作mplayer的播放列表,以后只要播放这个列表就可以了。假设自己的多媒体文件放在路径 /mnt/dpan/music/ ,将制作好的播放列表放在路径 ~/music/ ,制作方法如下:

          1.   #echo /mnt/dpan/music/* ~/music/xxx.lst        回车,xxx是你要创建的列表的文件名;

        2.   打开xxx.lst ,对其编辑,可以看到里面的曲目信息没有换行,用鼠标点在每个空各处,回车,使每个曲目占一行,这一步的编辑不能少,否则这个列表是不能播放的。

        3.   这样一个列表就制作好了,输入#mplayer -playlist ~/music/xxx.lst ,就可以播放列表中的所有音乐了,通过 pageup 和pagedown 来选择歌曲,通过上,下,左,右方向键可以调节歌曲的进度。

        注:你也可以将某一个歌曲文件添加到播放列表中,方法一样,只须将 上面的所有文件换成某个具体的文件。 本方法是在 http://hi.baidu.com/pxrchen/blog/item/2998d1516654e92542a75b9e%2Ehtml 的基础上改进而来的。

安装方法:
tar jxvf MPlayer-1.0rc2.tar.bz2
./configure--prefix=/usr/local/mplayer
cd MPlayer-1.0rc2
make;makeinstall;
/usr/local/mplayer/bin/mplayer
/usr/local/mplayer/bin/mplayer:errorwhileloadingsharedlibraries:libiconv.so.2:cannotopensharedobjectfile:Nosuchfileordirectory
whereis libiconv.so.2
libiconv.so:/usr/local/lib/libiconv.so.2/usr/local/lib/libiconv.so

ln-s/usr/local/lib/libiconv.so.2/usr/lib

/usr/local/mplayer/bin/mplayer

MPlayer1.0rc2-4.1.2(C)2000-2007MPlayerTeam
CPU:Intel(R)Pentium(R)Mprocessor1.70GHz(Family:6,Model:13,Stepping:6)

列表做法:
$ ls $HOME/music/*.mp3 > music.lst
[root@localhost Mplayer]# vi music.lst
1.mp3
2.mp3
3.mp3
mplayer -playlist music.lst
即可!
Mplayer正在运行,你再运行一个播放列表。
[root@localhost Mplayer]# ps aux|grep mpl
root      8866  4.0  0.2  24588  3908 pts/1    S+   19:57   0:04 mplayer -playlist music.lst
root      8875  0.0  0.0   5016   692 pts/3    R+   19:59   0:00 grep mpl

出现错误:
[root@localhost Mplayer]# mplayer ~/Mplayer/music.lst
MPlayer 1.0rc2-4.1.2 (C) 2000-2007 MPlayer Team
CPU: Intel(R) Pentium(R) M processor 1.70GHz (Family: 6, Model: 13, Stepping: 6)
CPUflags:  MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled for x86 CPU with extensions: MMX MMX2 SSE SSE2

Playing /root/Mplayer/music.lst.
Win32 LoadLibrary failed to load: avisynth.dll, /usr/local/mplayer/lib/codecs/avisynth.dll, /usr/lib/win32/avisynth.dll, /usr/local/lib/win32/avisynth.dll

这样也就只能一次播放一个列表,直到这个播放完毕再播放下一个列表。
如果你想在它播放music.lst的时候进行echo "1.mp3" >> music.lst来插入的话,最后它还是不会播放你插入的那个Mp3,估记在它调入的时已经把那个文件给读取到内存了。特别注意!

来源:http://blog.csdn.net/wushuan10141/archive/2008/07/31/2747790.aspx
摘  要

    本文主要论述了嵌入式浏览器开发所涉及到的技术,对HTML词法分析、浏览器JavaScript支持、linux和gtk编程等做了详细的分析和介绍,并对Netbit浏览器的开发进行了介绍,分析了主要的模块的功能和组成,并给出了主要算法。

还对典型的嵌入式浏览器进行了分析,包括Gzilla,Mozilla,Thunder和zen,总结了浏览器设计的技术要点和开发策略。

另外,在论文开头,介绍了目前嵌入式浏览器产品的发展现状,嵌入式浏览器的组成和各部份功能说明。

    HTML词法分析是着重讨论的技术问题,给出了详尽的数据结构,程序流程。

    Netbit浏览器的开发,是本论文的重点,分模块进行了分析,提出了需要改进的地方,并给出了改进措施。

关键词:嵌入式浏览器,HTML词法分析,Javascript,linux,gtk

阅读全文

   作为过来人思前想后,我感到完全有责任将发自心底的感受传递给年轻一代,“一个企业家心灵深处渴望优秀人才的卓越追求和深层次的叹息、痛苦和感受”。您们千万不要等到毕业求职时才觉得自己能力太差,世界上从来就没有后悔药。当然,如果您现在看了我写的这篇文章可能还不算晚,因为您还有机会在以后的岁月里奋起直追——“亡羊补牢,尤未为晚”。对于现在刚进入大学的学生,您应该更加珍惜这美好的求学机会,因为眨眼之间几年就过去了,您很快就会感到来自全社会生存竞争的压力,您面临的对手再也不仅仅是您身边的同学,今天您在班上的成绩的确是前几名,但一走到社会上去才感到是多么地脆弱而又多么地不堪一击。阅读全文
致阅读本书的大学生朋友阅读全文
针的指针老是给人讲懂了又忘记,忘记了又讲懂了,但是就像是一个橡皮擦一样一直没有真懂,于是还得复习一下。
1.记住两点:
(1)什么样的类型决定去指向什么样的内容,*一般表示取这个变量指向(可能是指针或者首地址)的内容,如:整形的指针指向整形的内容
(2)任何变量都有地址,变量名指向它的内容(指针的内容是地址或者非指针类型内容可能是char int等),取地址一般得加&,可以通过%p打印出来,而指针特殊在他本身内容是地址,为此,打印%p的时候呢,如没有加&是打印的指针的内容(存的地址),而按照区地址一般加&的原则来打印指针的时候呢,打印的是指针的地址而不是其内容地址。
实践:


point.c
#include
int main()
{
        int a=8;
        int *p;
        int *p2;
        printf("%p\n",&a);
        p=&a;
        printf("%p\n",p);
        printf("%p\n",*p);
        p2 = p;
        printf("%p\n",p2);
        printf("%p\n",p2);
        printf("p=%p\n",&p);
        printf("p2=%p\n",&p2);

        printf("%d\n",*p2);
}
问:如果想打印p指针本身的地址,如何弄?
答:printf("%p",&p);
问:p2=p是如何赋值的?
答:p的指针内容(里面存的是个地址)赋给p2。
问:p,p2存储的内容(地址)相同,它们两个的地址相同?
答:不同,可以通过打印他们的地址:printf("%p",&p); printf("%p",&p2); 来对比一下。

[root@vm0000055 ~]# ./a.out
a=8
a=0xbf8df31c
p=0xbf8df31c
p2=0xbf8df318
*p2=0xbf8df31c
**p2=8


#include
int main()
{
int a=8;
int *p;
int **p2;
p=&a;
p2 = &p;
printf("a=%d\n",a);
printf("&a=%p\n",&a);
printf("p=%p\n",p);

printf("p2=%p\n",p2);
printf("&p2=%p\n",&p2);
printf("*p2=%p\n",*p2);
printf("**p2=%d\n",**p2);
}

[root@vm0000055 ~]# ./a.out
a=8
a=0xbfb3cd7c
p=0xbfb3cd7c
p2=0xbfb3cd78
*p2=0xbfb3cd7c
**p2=8

问:上面程序p2,*p2,**p2有什么区别?
答:printf("p2=%p\n",p2);打印的是p2指针的内容(它的内容是一个整形的指针变量),也就是p的地址&p(也就是指针p的地址,当然这个地址里面存着p的内容)
      printf("*p2=%p\n",*p2);,而*p2也就是p的内容(a的地址),前面说过*就是取内容。
     printf("**p2=%d\n",**p2);在前面再加一个*,也就是取到了a的地址后,在取到这个地址指向的内容,及时相当于printf("%d",a);
如还不熟悉参考:
yahoo一题目:把一个字符串倒序:
http://blog.5ifd.com/post/1883/

                                                                                                                       最后呢,版权所有,向东,呵呵!




买了MSS后,一直在想怎么把它用好,之前由于系统的东东少,所以大部分软件和功能都要手动实现,记起刚玩的时候,那叫一个累!现在www.openmss.cn推出了一键安装包,一下子使得MSS的使用变得异常简单,如果不算开始给硬盘清零,只要十几分钟就能搞定。不过,一键安装包装完后,还要再进行一些个性化的设置,我总结了一下:阅读全文
知识参考:【网卡配置】 linux netconfig 命令详解,CentOs5.3默认不安装netconfig了,得用setup!
http://blog.5ifd.com/post/1718/



之前用过CentOS5.2 Linux这个操作系统,其实现在使用 CentOS5.3 应该也差不多吧,

但是以一开始使用就觉得有点吃惊,后来发现了和旧版本不一样的东西,

因为开始使用Linux都是配置网络开始的,所以也就是在网络这一块开始发现的,呵呵。

下面我先启动一下 CentOS5.3 , 配置网络方面,很自然就会使用 netconfig 命令,

这个命令在CentOS5.1中就已经不能使用了,不知道5.3中是否还可以使用,

登陆到 CentOS 5.3 中,尝试使用netconfig 是不能使用的,并不奇怪。。。

其次就使用 setup 来配置,觉得有点惊奇,因为5.1版本可以使用的命令,现在不能

使用了。只好使用 system-config-network,阅读全文
这是翻译版本,英文原版是linux源码Documentation文件夹下的CodingStyle

一个良好风格的程序看起来直观、美观,便于阅读,还能有助于对程序的理解,特别在代码量比较大情况下更显现编码素质的重要性。相反没有良好的风格的代码读起来难看、晦涩,甚至有时候一个括号没对齐就能造成对程序的曲解或者不理解。我曾经就遇见过这样的情况,花费了很多不必要的时间在程序的上下文对照上,还debug了半天没理解的程序。后来直接用indent -kr -i8给他转换格式来看了。特此转过来一个关于代码风格的帖子分享一下~阅读全文
内容:从最简单的程序入手,手把手教你写程序,让同学们拿到一个复杂的程序或者任务,能快速找到切入点,写出程序,再在此基础上优化程序。当拿到一个任务时,不要急于动手写程序,先仔细分析它的以下几个点:
1、它要单片机整体实现什么功能
2、功能细分(模块化),先干什么,再干什么,最后干什么
3、画初步流程图,(把几个模块画出即可)
4、模块之间的分析:一个模块到另一个模块之间,怎么变换,怎么连接(优化流程图)
5、单个模块分析:每个模块要做什么(流程图细化)
6、所有模块结合连接,细化所有流程图
7、分析单个模块每步要用到的方法或者指令
8、总流程图定型
9、纸上写程序,对照流程图分析其可行性,若不可行则返回
10、上机调试,加注释
以上十步,缺一不可(小程序列外)
切记:流程图的确定很重要,需反复修改
大忌:拿到任务,不仔细分析就写程序。即使是小程序,我们也要养成良好的编程习惯,不要一味的追求结果。写小程序可能比别人快,若是大程序,一旦出现思维混乱,或者出现程序调试不出结果,那么你花在调试上的时间,要比别人的多。           !!!!!!磨刀不误砍柴工!!!!!!
程序的优化:属于后期工作,只有调试出来后,才去优化,如果一开始优化和写程序同时进行,一是加重你的思考量,二是出现问题无从下手。无疑增加了写程序的难度。对于一个初学者,写一个程序,本身头脑就处于紧张的状态,思考的问题就很多,如果此时把优化程序也考虑进去,你脑袋的负荷无疑加重,若你头脑精明,你可以把优化的地方,先在纸上记下来,等到调试结果正常,再把你想到的,优化的地方加进去。
我从小就有很强的好奇心和动手能力,想知道每一件东西是如何工作的,对自然科学非常着迷。我还记得,小学时在课堂上用钉子和电线做电磁铁被批评;初中画电路图做收音机被同学取笑;高中被禁止做一种能开所有教室门锁的万能钥匙。我父亲是一名中学物理教师,他的实验室是我那时的天堂。

小时候最大的乐趣是拆装东西。从玩具,闹钟到收音机,凡是能拆的就拆,拆了再装起来。当然,拆坏过不少。不知什么时候起,开始会修了。见过的没见过的,都敢拆开修一修。家电的一般故障,是很简单的。稍微麻烦点元件坏了没有备用的,征得对方同意,我会利用我现有的元件做个替代方案弄上去,也能工作。实在不成,也能告诉对方是什么坏了。

高中时修的东西,大部分是同学们们的单放机收音机之类的。到了大学,我是家电维修与咨询协会的会长,不定期的组织免费维修工作,为同学提供方便。顺便说一句,干这个,可以认识很多平常搭不上话的美眉。人家既感激你,又觉得你很有能耐。其实,我也就是处理了她的单放机的一个虚焊而已。每次放假,还没到家,就有七大姑二大爷的预定,等我去给他们修电视机、电风扇什么的。一直到我有了老婆带回家,才安生了点。

按照自己的兴趣,我大学时选择了物理专业,有了良好的数理基础。平常没事,就泡在图书馆里。艰深的读过数论图论,科普的读过霍金系列。当然,看的最多的是电子和计算机类书籍。

我对电子技术、自动控制这一行,非常热爱。除了图书馆,就是在一位老师的实验室里。这位老师是国内最早搞单片机的一批人之一,现在已经退休了。认识一位好老师真的很重要。他可以不给你上课,但能给你提供一个环境,让你自由自在的发挥,让你的想法变成现实。后来我能力日渐成熟,做了很多公司的项目,也大部分是给那位老师的同学的公司做的。

2002 年我大三,带领另外两个同学获得大学生电子设计大赛一等奖。之后,我开始接手公司的实际项目。不大,但是我独立完成全部工作,如电源电路,芯片选择,驱动,画电路板,51汇编,现场调试等等都做了。然后又做过类似的几个项目。从那以后,开始逐渐深入嵌入式系统的设计。我做的项目包括医疗器械,电动自行车变频控制器,专用表头,计量仪器,工业控制设备,图像处理设备,高频系统等。阅读全文
嘿嘿,关于看门狗的作用,我来讲……

1:要讲系统的可靠性,首先要讲系统安全保证机制的可靠性,对于MCU系统来说,养DOG是其中最重要的一条

2:很多人可能要讲,我没养DOG,我的系统也很可靠,所以看门狗没有必要。
   这是一种不需要反驳的观点,从理论上来讲,养狗安全系数肯定会高一些;

3:在系统里面养狗,狗本身电路也是存在失效可能性的,在上面有人曾讲到MAX813翘了,这就属于这种情况,MAX813还属于比较好的,过去很多人经常用到的25045,内部集成了EE等资源,这东西不怎的,很容易被干扰得自己挂了。

4:很多人在争执系统里面应该如何养狗,很多人片面的以为狗一定要在主循环里面养才是最好的,在这里不得不说说hotpower的中断养狗论了,当年 hotpower为了证明那些人的说法是何其错误,整出了一个中断养狗论,很多人根本没看懂hotpower想要表达的真实含义,从原理上讲,hotpower其实要表达的是:要想养一条忠实听话的好狗,在哪个地方养根本不重要,在哪个地方养都可以达到最好的效果,真正重要的是要注意软体返回的各个路径,在异常的时候,要通过条件互驳,让狗起来看家。

5:虽然hotpower中断养狗的方法也可以达到比较好的看家效果,但俺却是一个主循环养狗的坚定拥护者,原因无它,第一:主循环养狗简单明了;第二:主循环养狗比较省代码,第三:不管是中断还是主循环养狗,实现条件互驳,这只狗都一样忠实。
6:在这里不得不说程序结构,那种流水帐的程序结构,不管是中断还是主循环养狗,结果都是一样:养了一只癞皮狗!关于这一点,如果谁有不同意见,可以提出来讨论讨论

7:这些都做好了有什么用呢?
一个再忠实的狗,也只能是系统的一部分,在矿安产品中有一个说法叫:本安型,也就是本质安全性,当然,MCU系统是无法实现本安性的,所以需要看家的 DOG,但系统的根本依然是要努力提高系统本身的安全性,一个再好的看门狗动作处理,也只能是尽量恢复现场,并且,系统也绝不能总是出现保护的行为,如果这样,将是一个不可原谅的设计……
这就又延伸到电路设计和PCB设计甚至工艺设计等等问题,这不是这个主题帖讨论的范围,所以,俺也不说了……
二:
MCU系统为什么要DOG!?

DOG是为了防止不知道哪天出现的窃贼的,对付已知出现的窃贼,最好的办法就是直接拿棍子轰倒……

对于一个系统,通过测试只是尽可能模拟实际可能出现的干扰,显然:从数学的概率讲,不能涵盖100%的情况,并且,一个产品可能大批量的被众多不同类型用户使用,所以,测试条件的样本抽取本就不可能重现100%现实状况。

一句胡说八道的理论:如果你的系统产生复位,说明你的设计不行,改好设计就可以,所以没有必要要看门狗……

本懒得反驳,看应和者居然众多,避免错误的理论误人子弟,必须以证视听:
我已经讲过多次了,测试只是一种必要不充分的条件,请认真理解这个来自数学的概念……
没有测试,只能通过在实际使用条件下的试用来检验设计,这样的设计更加是不充分的测试,而且,这样的测试只能更加无序的浪费时间和精力……
一个是安装chmsee,用新立得管理工具,搜索chmsee,安装即可。
另一个就是给firefox安装个插件,工具--->添加组件--->获取附加组件搜索chm reader
下载:

你可以开多个浏览器IE,FIREFOX等来测试,你也可以通过它来进行两个远在天边的人来聊天:
点击:http://www.5ifd.com/comet


<?php

$filename  = dirname(__FILE__).'/data.txt';

// store new message in the file
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != '')
{
  file_put_contents($filename,$msg);
  die();
}

// infinite loop until the data file is not modified
$lastmodif    = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif) // check if the data file has been modified
{
  usleep(10000); // sleep 10ms to unload the CPU
  clearstatcache();
  $currentmodif = filemtime($filename);
}

// return a json array
$response = array();
$response['msg']       = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
flush();

?>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Comet demo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="prototype.js"></script>
  </head>
  <body>

<div id="content">
</div>

<p>
  <form action="" method="get" onsubmit="comet.doRequest($('word').value);$('word').value='';return false;">
    <input type="text" name="word" id="word" value="" />
    <input type="submit" name="submit" value="Send" />
  </form>
</p>

<script type="text/javascript">
var Comet = Class.create();
Comet.prototype = {

  timestamp: 0,
  url: './backend.php',
  noerror: true,

  initialize: function() { },

  connect: function()
  {
    this.ajax = new Ajax.Request(this.url, {
      method: 'get',
      parameters: { 'timestamp' : this.timestamp },
      onSuccess: function(transport) {
        // handle the server response
        var response = transport.responseText.evalJSON();
        this.comet.timestamp = response['timestamp'];
        this.comet.handleResponse(response);
        this.comet.noerror = true;
      },
      onComplete: function(transport) {
        // send a new ajax request when this request is finished
        if (!this.comet.noerror)
          // if a connection problem occurs, try to reconnect each 5 seconds
          setTimeout(function(){ comet.connect() }, 5000);
        else
          this.comet.connect();
        this.comet.noerror = false;
      }
    });
    this.ajax.comet = this;
  },

  disconnect: function()
  {
  },

  handleResponse: function(response)
  {
    $('content').innerHTML += '<div>' + response['msg'] + '</div>';
  },

  doRequest: function(request)
  {
    new Ajax.Request(this.url, {
      method: 'get',
      parameters: { 'msg' : request }
    });
  }
}
var comet = new Comet();
comet.connect();
</script>

</body>
</html>



prototype.js



分页: 241/339 第一页 上页 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 下页 最后页 [ 显示模式: 摘要 | 列表 ]