
**********************************************
修改时间:	2012年7月10日 上午 11:46

    自从6月25日毕业之后忙着找租房住,到现在快一个月没有修改编译器了，这半个月心态终于恢复平静了，
终于适应了没有归属感的生活，以后开始为自己打拼了……

    今天上午修改了AVR编译的一个至关重要的BUG，就是对于端口位变量的修改，改成原子操作，
这样可以在中断中修改某个端口而不会和其他的进程冲突；

    而以前对于端口位变量是采用“读-修改-写回”这样，在中断和操作系统调度中会有隐患，
为了避免冲突，需要把端口分配好，例如在舵机控制中断里修改了PORTB端口，那么在主函数中
就不要定义PORTB端口，例如小灯和按键等不能接在PORTB端口；现在改正了，用小地鼠程序测试通过，
原来的HEX文件是19.6KB，现在的HEX文件是18.2KB，但是功能相同。

    以前关于nop指令的疑惑（在操作系统中加上和减去一个nop空指令，程序就莫名其妙的不对）
可能也是这个原因导致的，端口访问冲突；

    另一个记忆：电子设计大赛的时候，写的那个控制程序总是莫名其妙的干扰数码管显示，好在
不影响功能就没怎么找原因，现在想想可能是这里的问题，两个进程使用同一个端口，冲突了。
以后有时间分析下那个程序，看看是否端口分配有隐患。。。

    现在总算改正这个BUG了。不过没有专门测试端口的多进程访问，应该是没问题了。

---------------------------------------------
备注--在汇编转换库中这样处理的，没有修改编译内核：

# 写入分量_uint8_uint8_bit $n1 $n1 $n2 $location $vv1 $vv1 $vv2//
$area = $n1 <= 0x3f//
$static = $vv1 string_equal static//
$IO = $area && $static//
$NOT_IO = ! $IO//
#if $IO//
$nn1 = $n1 - 0x20//
ldd_$vv2 r30,$n2
sbrs r30,7
cbi $nn1,$location
sbrc r30,7
sbi $nn1,$location
#endif//
#if $NOT_IO//
$c1 = $location / 8//
$index = $location % 8//
$or1 = 1 << $index//
$and1 = 255 - $or1//
$nn1 = $n1 + $c1//
ldd_$vv1 r31,$nn1
ldd_$vv2 r30,$n2
sbrs r30,7
andi r31,$and1
sbrc r30,7
ori r31,$or1
std_$vv1 $nn1,r31
#endif//
---------------------------------------------

**********************************************
修改时间:	2012年7月11日 上午 10:25

    把控制台界面改为在工作台内部的一个panel实现,这样不需要处理焦点转移等,也可自由拖动;
把原先的控制台文件改成启动器界面,显示软件启动过程中的进度,目前用文本显示.

上午 12:21
----------------------
把启动器界面改为双缓冲图形模式显示,加上了一个进度条和背景图片;

**********************************************
修改时间:	2012年7月17日 晚上 10:35

    这两天停电，好郁闷。
    把编译器的近期文件列表改成启动时加载和关闭时保存，其他时间都在内存中维持更新列表，
这样在程序文本和加号界面切换时增加列表的刷新速度，比以前快多了。

**********************************************
修改时间:	2012年7月18日 晚上 11:01

    刚才计划把变量类型改回来,放到变量的前边,去掉小括号,发现一个个地改很麻烦,先把查找和替换
这个功能实现吧,以前没时间实现,只是个框框,现在可以查找和替换了.

    刚才忽然想起一个好玩的设计:一般的文本编辑器的查找和替换功能有限,其实可以加上虚拟机指令,
然后每次找到一个字符串就执行一个用户写的宏.这个完全可以用这里的虚拟机实现.

**********************************************
修改时间:	2012年7月19日 半夜 1:47

    把变量定义顺序又改为和C语言一样了,还有一些小的地方没改,比如静态变量,组件名称定义交换等;
明天再说吧

用AVR和MCS51的一些软件仿真程序测试正常,改正了一些BUG,原来MCS51中没有"读取地址_vdata_uint8",
现在加上了;看了下原来写的AVR上的嵌入式操作系统uCORE,等有时间了再试试,那个还不错.
改成当前的语法版本,再想办法加到编译器内核中(或者是图形界面中);

**********************************************
修改时间:	2012年7月20日 晚上 10:11

    在系统数据文件中加入了控制台,编译信息界面和查找替换窗体的位置和尺寸信息,每次运行软件自动加载上次的;

**********************************************
修改时间:	2012年7月28日 半夜 1:04

    初步做好了AVR的图形界面,把端口改成PB_4和P1_4等,而不是P1.4这样,也就是说端口以位类型为主;下一步是
把图形组件的驱动程序文件路径改成根据用户单片机类型自动加载的....不对,多核情况下不好处理,先好好想想吧.

    或者先把字节型图形端口的链接处理好.

    这几天在忙着做小电冰箱,制冷片电路驱动部分今晚调试好了,明天开始装泡沫壳子试验.

**********************************************
修改时间:	2012年7月28日 上午 10:13

    上午用USB HOUND 调试ISP下载器,因为不能下载MEGA8,而下载MEGA16,MEGA32和89S52也没问题,流程都一样.
用PROGISP167和自己的下载器反复下载对比,找了半天,也没有一点文档资料,只能对照着找不同的数据.找了半天
终于发现了,下面这里(启动ISP下载时向USB发送的数据):

	if( i == 0 ) {
		StartEnfFlag = 0x0180;  //开始
	}
	else if( i == HEX.Length - 1 ) {
		StartEnfFlag = 0x0280;  //结束
	}
	else {
		StartEnfFlag = 0x0080;  //中间
	}
对于MEGA16,MEGA32和89S52都是发送的0x80,而对于MEGA8偏要发送0x40才行:

	if( i == 0 ) {
		StartEnfFlag = 0x0140;  //开始
	}
	else if( i == HEX.Length - 1 ) {
		StartEnfFlag = 0x0240;  //结束
	}
	else {
		StartEnfFlag = 0x0040;  //中间
	}

用小冰箱程序测试也没问题了可以下载.下一步是根据用户选择的芯片类型自动设置为0x80或0x40.

    有时间要好好搜集些ISP下载的资料整理成一个文档.

----------------------------------------
刚才测试了用0x40也可以下载MEGA32,先暂时用0x40吧.

**********************************************
修改时间:	2012年7月28日 晚上 9:31

傍晚出去转，慢慢地骑车走了好久，想到两个关键的设计：

一是每个图形组件都指向唯一的一个驱动文件，在驱动文件中再根据CPU类型加载不同的具体文件，
或者先写一些处理器无关的代码然后加载处理器相关的代码；

二是不用处理器类型了，应该每种板子都有类型，如 MCS_24MHZ  STC_12MHZ  AVR_6MHZ 等等;

**********************************************
修改时间:	2012年7月30日 下午 6:18

    今天折腾了一天,终于改进了编译器的CPU设置部分,原先是在程序开始由用户设置,现在
改成在组件库的图形组件驱动程序中加入处理器信息,格式: A MEGA32 AVR_6MHZ, 这样
整整折腾一天,编译总是出问题,刚才终于发现原因了,原来编译器对于每个处理器设置指令
都生成一个虚拟类型包, I0, I1 等等,这些和设置指令在同一个层次下,导致处理器设置指令
只能写在最低层次下,而不能写在每个组件内部的.现在改好了,把它写在控制器组件的结尾,独立的

    增加了板子类型这个参数,和CPU类型不一样,CPU类型用于编译过程,而板子类型用于图形化
智能加载驱动,不需要用户手工指定和他的板子相匹配的驱动程序,以后对于驱动程序的语言也
可以这样,根据用户的设置自动加载中文或英文的驱动库;

**********************************************
修改时间:	2012年7月31日 上午 9:17

    昨晚上调试DS18B20，折腾一晚上还是不行，最后打开以前的版本对比终于发现问题了，
原来DS18B20的延时指令少写了一个0，真郁闷，改过之后一切正常。今天上午把编译器的图形
界面配置代码自动保存弄了下，对于库函数等不带有图形配置代码的，保存时不加上配置代码，
要不然每次还要手工删掉，现在是只有切换到图形界面之后才会保存图形化配置的。

---------------------------------
2012年7月31日 下午 2:55

    把编译器的组件设计器改成可以保存的,打开某个组件可以保存更新,又把组件改成
单文件形式的,用串行序列化实现,以前是把配置文本和背景图片保存为两个文件,现在
序列化成一个文件. 为了保持兼容以便打开以前的组件文件,只需把后缀名改为小写 m 即可;

    今天整整下了一天的雨. 

---------------------------------
2012年7月31日 晚上 10:52

    晚上做好了NOKIA5110的电路测试通过,然后做好了一个5110的图形组件,可以使用了. 改正了
编译器的一个BUG,在组件设计器中调整图片大小后保存无效,还是原大小,现在改正了.

    下了一天的雨, 出不去, 就中午煮了碗面, 早上和晚上都没吃饭, 饿得慌. 晚上北京的王师傅
打电话过来商量合作的事, 好好合作尽量争取一些投资然后开淘宝店卖设计的这些电路板.

**********************************************
修改时间:	2012年8月1日 上午 9:11

    做好了NRF2401的图形化组件,可以在图形界面中直接拖出,测试通过; 
改正了组件设计器的一个文件保存的小BUG, 保存和导出这两个先做判断再调用公共保存函数;

    下午调试12864的液晶驱动和图形变换程序,屏幕上出现两个方块，应该是一个的。
最后终于发现是AVR的汇编运算库有个输入错误，$location写成0$location了，
还有那个移位运算，不应该截断的！！！比如字节型移位，截断到0-7，当移位数为8是截断到0，不移
实际上应该全部移出的。

-------------------------------
2012年8月1日 晚上 10:40

    把位类型的名称改成 IO,不再和 N8 N16 等兼容; 把BOOL类型的常量改为 YES NO,以前是 true false;
调试程序发现一个小BUG,找了一会儿才找到,在宏变量的写入没有做类型检查导致异常,现在已经改好了.

    把 void 改成 V,位变量改为 HIGH LOW,

-------------------------------
2012年8月1日 晚上 11:49

    把函数定义的大括号去掉了, 去掉了组件定义的"组件"关键字;
另外加了一个 OK 关键字,没有任何实质操作,只是语法上是一个语句,一个示例:
================
V 启动

	控制器 初始化,
	
	反复执行
		控制器 指示灯 闪烁: 5,
		定时器 延时100毫秒: 5,
		...
	OK.
结束.

**********************************************
修改时间:	2012年8月2日 上午 10:54

    上午改了很多语法上的细节,组件用中括号,静态变量和常量类型放前边,ACI const等;
以后试试看能否把字符串的双引号换成单引号,和字符一样,然后编译器智能判断是处理成字符还是字符串;
注释也可以不用 // 开始,而是用两个下划线,可以这样写, 例如:  _________________________________

    另外把配置代码的中转器去掉了,直接连接就行,因为端口不用 P1.2这样表示,而是 P1_2,独立的端口;

**********************************************
修改时间:	2012年8月4日 上午 9:52

    上午设计字节类型的图形化端口,先把ISP下载弄一下,下载很费时间,原来是文本框的字符行这里,以后
尽量把文本字符行复制为一个字符串数组再处理,这样反而更快一些.另外去掉了Number类,用系统自带的
数字和字符转换函数,自己写的函数运行效率比较低.

    现在下载速度很快了,没有开始的那个等待时间,应该和 PROGISP 167 的下载速度差不多了,还行.
---------
    开始准备设计图形化字节端口,争取上午设计好...
---------
    到中午终于把图形化端口设计好了,用12864液晶屏试验8位并行端口,OK
下一步是增加优化程序,当端口按照数据顺序连接时直接产生字节型连接,而不分解成位端口连接;
---------
    弄了一下午把并行端口配置的顺序连接优化做好了,当用户不按顺序连接时给出一个提示,但不影响编译;

另外偶然试了一下贝赛尔曲线,以前端口之间的连线直接用直线,不好看,今天改成贝赛尔曲线,很不错,
原来贝塞尔曲线可以用来平滑线条的,非常不错.下一步在端口上加上方向标志用于贝赛尔曲线斜率标注;

-----------------
2012.8.5 晚上 0:09
    弄到半夜终于把贝赛尔曲线的程序写好了,现在图形界面的导线不再是斜的直线连接端口,而是一条
平滑的曲线连接,给每个端口添加了导线方向属性,绘制导线时从一个主端口沿着导线切线方向发出,然后
顺着一条光滑的曲线(贝塞尔曲线)到达目标端口;  以前是直接用直线连的.

**********************************************
修改时间:	2012年8月7日 夜里 0:19

    今天几乎为组件库和组件文件的设计郁闷了一天,本来计划上午把液晶屏的
文字点阵驱动程序写写,然后发现需要先做组件的继承机制,于是把组件的驱动指定
从组件文件中分离出来,用一个B扩展名的txt文件指定,这样可以为一个M文件指定
多个驱动文件,从简单到复杂. 到中午没写好,越想越头疼,下午睡了半天,醒来迷迷糊糊地
就去外边买菜,忽然想起还有呢,就在路边看看一群人跳休闲舞,看一会就回来了,
心情很低落...呜呜...早上没吃饭,晚上也没吃饭,不想做饭了饿着,刚才终于把
那个组件库的设计弄好了,明天可以做液晶屏的多个独立驱动,用户可以选择某个驱动程序,
这样比较好;

    今天心情特殊的低落, 睡个好觉吧...  但愿明天有个好心情

**********************************************
修改时间:	2012年8月7日 上午 12:37

    上午测试组件继承方案,最后加了一个 io 链接,把组件库中每个组件的驱动文件和包文件
的格式统一下,每个驱动都有一个格式化的包文件用于用户导入,而且通过包文件还可以实现
多语言版本的组件库,每个包文件中对组件驱动进行端口加载和链接配置,以及虚公开成员的定义链接,
这里的虚公开成员可以用某种指定的语言命名,如英语,汉语等;

    发现了一个BUG,当一个函数不加 link 修饰而连接到另一个函数时,编译器报错,
但是在添加报错信息时又出错了,导致异常(在 GetLine函数中没有成功获取到行号),
有空检查下具体原因;

**********************************************
修改时间:	2012年8月8日 半夜 3:20

    通宵到半夜终于把图形化组件的旋转弄好了,可以顺时针旋转90度和逆时针旋转90度,程序中根据
角度值导入不同的图片,并且组件的每个端口也跟着旋转同步,应该没问题了.

-----------------------
2012年8月8日 上午 10:57

    把组件库的目录解析提取出来,可以在程序中设置.以后改为可以用户设置,然后组件库和编译器
完全独立,这样就大大减少编译器的兼容压力了.组件库不保证向后兼容.它只是一个可扩展的插件.

-----------------------
2012年8月8日 晚上 8:32

    在编译器的 include 预处理中提取文件索引,而不是放到词法解析中,这样在输出行错误的
时候也可以定位文件了,而以前单击行错误也无法链接到出错的文件.

-----------------------
2012年8月9日 晚上 1:25

    增加了一个组件配置器,现在只是显示 *.B 文件的内容,明天做文本解析
显示到界面上,并生成配置代码.争取也加上编译提取驱动函数成员信息
和 XML 类似的注释等,用于组件自动化描述;

**********************************************
2012年8月10日 晚上 1:03

    今天把组件配置器的多语言弄了下，可以添加和删除语言， 下一步是把各个语言的函数
定义存储起来...  睡觉了...

**********************************************
2012年8月10日 下午 6:58

    刚才终于把多语言版本的组件配置器设计好了，用SD卡显示扇区测试通过，还有一个小BUG：
暂时无法选择语言，于是手工改成中文的才行，下一步是把语言选择加入到组件中，
可以右键单击组件选择某个语言，这样不错。

**********************************************
2012年8月11日 半夜 1:59

    晚上给组件加了语言选择列表，在语法上增加一个语言设置指令： A SetLanguage ***，
在文件导入时进行替换，定位某个语言文件。现在对于液晶屏和SD卡等功能模块应该
没有大问题了，就是对于单片机最小系统板子需要手工修改配置文件才行。下一步是把io文件
由编译器自动生成（从组件文件中的PortList提取端口列表信息生成io文件），再把单片机
的控制类型组件的生成改一下，基本就没有大问题了，然后可以开始进行其他组件的测试。

**********************************************
2012年8月13日 上午 8:41

    忙了将近一个月终于把图形用户界面设计好了，下一步开始做一个微型的操作系统，每次用户
在图形界面中拖过来一个组件的时候，就向OS中添加一个进程函数用来支持这个组件的后台运行，
例如，用户在组件库中选择了一个4位数码管模块拖到图形界面中，然后图形界面的解析引擎自动
把这个数码管的动态扫描显示程序加入到OS中后台运行，而不需要用户手工地去反复调用维持显示；

    计划采用单一线程的方式设计OS，非抢占式的，这样不需要用户处理资源的访问冲突和进程
互锁等等，每个进程设计成“事件”的方式，每次只要执行就会全部执行完，不会被其他进程中断。

这种OS的缺点是用户的各个事件可能发生阻塞，系统的底层驱动（各个组件的后台程序）也会被阻塞。

**********************************************
2012年8月16日 上午 11:44

    做好了一个事件调度器,现在是手工添加各个组件的事件处理代码,下一步是集成到图形界面中,
自动产生配置代码,用户只需要完成相关的事件处理程序就行,被忽略的事件则指向一个空函数.

---------------------------
下午 4:55

    下午调试AVR的定时器0,把原先的16位定时器空出来可以做多通道的音乐播放引擎,发现库函数中的
寄存器地址弄错了! OCR0 寄存器的地址是 0x5C,但是定义成 0x3C(好像是EEPA),难怪以前向OCR0赋值
出错呢.有空了重新检查一下寄存器定义...  现在就检查吧...

    把操作系统的时间定时改为 Timer0,不用 Timer1 了.

**********************************************
2012年8月20日 半夜 0:12

    今天又停电了。只好去网吧写程序，把RS485的中断接收缓冲写好了，而且收发非常稳定，顺便
测试前几天写的微型调度内核，还不错，只是那些初始化和事件分发等都是手工写的；
刚才终于把手工写的代码部分做成编译器自动产生，根据图形界面中的所有组件逐个处理生成系统调用；
用户只需写各个组件的事件响应就可以了。

**********************************************
2012年9月2日 半夜 0:01

    刚刚给两个公司做了两个项目，今晚上开始调试编译器，把右键的快捷菜单改为panel，这样可以在
其中添加列表，事件集合，属性等。处理好了右键按下等基本操作，现在和普通的右键菜单一样了。
明天把组件的元素列表（事件列表）解析到这个右键菜单上，用户可以选择某个事件添加自己的事件处理代码。

**********************************************
2012年9月2日 下午 5:44

    把组件的事件列表处理好了,像windows程序一样,用户在表格中输入事件名称,当发生事件时自动调用
用户的事件代码.下一步是增加双击处理,当用户双击图形界面的事件名称时编译器自动转到
文本界面的事件处理代码;

**********************************************
2012年9月6日 上午 9:42

    AVR的移位运算中不再清除高位,直接按照原数据移位,因为高出范围的数字应该全部清零;

**********************************************
2012年9月6日 下午 6:27

    下午程序居然编译出错了!数码管和74595没有输出,折腾半天忽然想起上午把
AVR的移位运算改了下,不再清除高位,于是再好好检查下,发现去掉的指令之后正好是
测试0跳转,不能去掉的,于是换成cpi指令,一切正常:

# >>_uint8_uint8_uint8 $n1 $n2 $n3 $vv1 $vv2 $vv3//uint8-补0右移
ldd_$vv3 r31,$n3
ldd_$vv2 r30,$n2
cpi r31,0    //===============这里原来是 andi r31,0b00001111
breq @label2
@label1:
lsr r30
dec r31
brne @label1
@label2:
std_$vv1 $n1,r30

**********************************************
2012年9月16日 中午 12:08

    上午半天把工作台的按钮界面改成缓冲Panel，实现了鼠标移动时显示小方块和放大的图标效果；

**********************************************
2012年9月17日 中午 12:35

    上午设计多语言语法,在词法层面上进行宏替换,把 如果 否则 替换成 if else 等,发现一个BUG:

V 启动
	如果 5 > 4,
		N8 d = 0.
	
OK.

这个小程序第一次编译时居然报错,之后再编译就不出错了,开始以为是今天的编译器代码问题,后来
发现用以前版本的编译器也报错,看来是一个潜藏已久的问题啊,肯定是某个小小的初始化未被调用,
一会儿回来好好检查下原因;

--------------------
下午 3:38

终于找到问题了,在每个函数编译的开始加上这句就行了:

ExpLevel = 1;

这样遇到的第一个判断语句中的表达式不会处理成无值表达式.

**********************************************
2012年9月23日 中午 11:39

    上午把控制语句的宏替换设计好了,通过@define实现类似于C语言的#define的效果,
现在可以用 "if" 或 "如果" 写程序控制语句了,下午争取把全部的中文关键字都处理成宏定义的形式;
目前的宏定义格式如下:

@define 如果 A.#.IF
@define 否则 A.#.ELSE
@define 反复执行 A.#.REPEAT

@define if A.#.IF
@define else A.#.ELSE
@define repeat A.#.REPEAT

**********************************************
2012年9月24日 半夜 0:22

    晚上把关键字的宏定义列表基本做好了,现在支持中文和英文两种关键字,下一步是实现关键字
的着色,并且在不同的文件中切换时,关键字列表也应自动切换,可以把关键字列表做成动态类,
内嵌到每一个ctext中;

**********************************************
2012年10月2日 晚上 7:06

    在图形界面的左上角增加一个圆环标志，会自动旋转，用来显示图形界面中加载的事件数和进程数；
--------
10月3日 晚上 8:13
    把宏替换改成位置无关,只要在同一个文件中就替换,而以前是在定义点之后;
这样去掉了程序开始的导入语言的指令,放到图形界面中产生,目前是硬编码直接导入中文列表,下一步是
在图形界面增加一个列表框,由用户选择语言,如选择英文就用 "if else" 等写程序;
选择中文就用 "如果 否则" 写程序;
--------
10月5日 晚上 9:07
    下午和晚上把图形界面改了下,不单独处理背景图片的位移,而是放在组件列表的绘制过程中,这样可以
实现屏幕左上角的小地图的显示(各个组件的小图标)等,争取明天实现;
    晚上主要设计图形界面左下角的引擎运转标志,加上了AIserene背景字符,效果不错;
--------
10月6日 上午 11:18
    加上了图形界面左上角的小地图,每个组件缩小8倍显示到左上角,还有图形界面加上了坐标系(横纵网格);

**********************************************
2012年10月7日 上午 11:54

    上午调试编译的进程方式,但是在包含文件中系统卡住了,最后把RichTextBox设计成即时创建和消除就
没问题了,有空了好好研究下为什么. 现在可以实现打开新的文件、切换文件和切换到文本模式这三种情况
自动调用编译预处理，用于提取程序信息和智能感知用户输入并提示成员列表。不过点击编译按钮还是
在主进程中处理，下一步是把编译过程也处理为独立进程，这样用户不需要等待，点击编译之后还可以
继续查看文本等；
--------
10月7日 下午 5:59
    把编译结果和编译错误列表分成两个独立的窗体，并且修改了智能感知部分，当从图形界面切换到
文字界面后可以正确识别最新的程序代码，而以前是从文本文件读取导致分析的不是最新代码，而是
最近一次保存的代码，结果不准确，现在改正了。
--------
10月8日 中午 12:55
    上午把编译器的编译在单独的进程中执行,而以前是在主函数的进程中,导致单击编译按钮时会有
几秒钟的时间界面是卡住的,不能响应鼠标和键盘事件; 现在改成独立的进程编译(后台编译),用户点击
编译按钮之后还可以继续查看文本等; 在界面上有一个进度条显示系统当前编译到哪个步骤;

    下一步是把这个进度条做美观一点,现在只是两个单像素的线条显示;
--------
10月8日 晚上 10:35
    编译完成后控制板闪烁两次绿色的"OK"字符提示用户结束;

**********************************************
2012年10月14日 晚上 10:50
    组件的右键单击显示事件列表中，去掉双击文本转到文本模式，而是增加了一组按钮，点击按钮转到
文本模式；按下按钮时则自动补全事件名称，下一步是增加一个事件代码框架，随鼠标移动，按下鼠标后
在鼠标所在的位置插入代码；

----昨天和今天整整在床上躺了两天，到现在病好了一点。。。好落魄啊，身边一个人陪都没有

**********************************************
2012年10月16日 半夜 1:13
    添加了一个事件代码框架窗口，当用户添加事件代码转到文本模式的时候显示这个窗口，
并且跟随用户鼠标移动，用户点击鼠标左键后在鼠标光标位置插入生成的代码，然后写个
小程序测试一下（数码管显示倒计时的程序）：

N16 D,

V 控制器_系统准备运行事件
	定时器 时间间隔 = 100,
	屏幕 小数点位置 = 0b0000_0010,
	D = 600,
OK.

V 定时器_时间到事件
	D - 1,
	屏幕 显示数字: D,
	如果 D % 10 == 0, 播放器 播放音阶: 75: 10.
OK.

居然发现了一个BUG：按程序应该每经过1秒钟就小喇叭响一下，但是不响，最后终于发现问题，
是 AVR 的汇编程序库有BUG，双字节无符号数的除法程序不对，如下是除法程序（错的）：

# %_uint16_uint16_uint16 $n1 $n2 $n3 $vv1 $vv2 $vv3//uint16-取余
$nn1 = $n1 + 1//
$nn2 = $n2 + 1//
$nn3 = $n3 + 1//
ldd_$vv2 r30,$n3    <------------这里不对了，应为 ldd_$vv3 r30,$n3
ldd_$vv2 r31,$nn3   <------------这里也不对，应为 ldd_$vv3 r31,$nn3
ldd_$vv2 r24,$n2
ldd_$vv2 r25,$nn2
ldi r26,16
mov r0,r26
......

然后重新检查下整个汇编运算库，居然又发现几处类似的BUG，都改正了。。。
汗了，以前那么长时间都没发现这个BUG是因为主要都是局部变量运算，碰巧 $vv2 和 $vv3 相同，
而这次定义的 D 是一个全局变量。

以后有时间要写个汇编程序库生成器，把其中所有的格式化代码全部设计为电脑自动生成，
不要再手工输入了，非常容易出错。

-----------------
10月16日 上午 11:41
    改正了一个智能感知的小BUG，单击事件转移按钮时也触发语法解析，然后把全部的触发点都
放到了切换函数中，省着以后忘了触发。
-----------------
10月17日 夜里 11:51
    给Tab分页控件加上了关闭指示，当鼠标移到上边时显示方框，添加了一个鼠标离开事件处理；
    把最近文件列表窗口改了下，加了一个背景图片和一列文件图标指示；
-----------------
10月18日 夜里 11:51
    想把智能感知的第一步做好，显示形参类型，但是不行！昨天和今天上午忙了将近一天也没
找出原因，形参列表总是为空，但是明明有参数啊~~ 刚才终于发现了，原来都是链接函数。。。

**********************************************
2012年10月19日 中午 12:05

    终于把智能感知的第一个功能实现了，当用户鼠标点击某个函数名时，显示一个小窗口，
上边有一个“转到定义”按钮，点击这个按钮就会自动打开指定文件显示这个函数。
    下一步是添加一个 LOAD 识别，可以打开后边的文件，然后开始设计正式的智能感知系统，
点击某个函数名时在一个小窗口中显示指定函数的简介等。
-----------------
10月19日 夜里 11:26
    把组件配置器的格式改下，增加了一列innerName，然后把所有的组件保存更新；
-----------------
10月22日 夜里 0:20
    下午把智能感知做好了，单击某个函数名可以显示这个函数的描述信息。

题外话：快点结束吧，真受不了这种生活了。。。具体感受写到日记里了。

**********************************************
2012年10月29日 晚上6:03

    在组件配置器中加上了 linkvar 类型，用来处理“向外链接”的变量，然后实现了
AD输入类组件的自动设置通道号，无需用户手工设置；
    下一步是把向外连接类型的变量显示到图形界面中（不包括OS开始的系统变量），
可以在图形界面直接设置参数，并且参数是可变的（不用常量实现），这样可以实现
在图形界面设置串口的波特率，定时器时间间隔等；
-----------------
10月29日 夜里 11:40
    晚上把ISP的下载提示显示到控制面板上,不再显示完整的ISP窗体,就像编译一样;
遇到一个头疼的问题: 图形面板刷新比较卡,最后发现改这里就好了:

//this.Invalidate();
this.Refresh();

    因为下载和显示在同一个进程吧,所以Invalidate不合适,而Refresh是立即执行的;
-----------------
10月30日 下午 6:41
发现了一个大BUG:
//=========================================
V 端口监控器_端口中断紧急事件
反复执行 250 次,
	DA转换器 发送数据: 0x3456,
	...
反复执行 250 次,
	DA转换器 发送数据: 0x3456,
	...
MCU TCNT0 = 0,
MCU TIMSK | 0b0000_0010,
MCU TIFR | 0b0000_0010,
结束.

上面的中断紧急事件是在中断中直接调用的,但是退出后有可能让OS挂了...最后加上了
后边那三个指令把OS定时扫描重新初始化就没问题了,排除了端口冲突的原因;以后
要好好研究下找出原因,目前先这样吧.
-----------------
10月31日 上午 11:05
    上午调试串口缓冲,先把编译器支持16位递减做好,按照下面的代码添加:

# 跳转递减_uint16_uint16 $a0 $b0 $ident $va//
$a1 = $a0 + 1//
$b1 = $b0 + 1//
ldd_$va r31,$a0
tst r31
brne @label1
ldd_$va r30,$a1  //!!!!!!!  这里应该放到前边!!!!!!!
tst r30
brne @label1
jmp $ident
@label1:
dec r31
cpi r31,0xff
brne @label2
dec r30
@label2:
std_$va $a0,r31
std_$va $a1,r30

结果不行! 检查半天终于发现这个小程序不对
现在改正了,可以在程序中这样写:

反复执行 500 次, ...

而以前是不能超过255次的.

    继续调试串口发送,最后在这个函数卡住了,折腾半天终于发现问题! %^%$@##@%
//---------------------------------------------------
V 端口监控器_端口中断紧急事件
指示灯 打开,
N16 n = 0,
反复执行 500 次,
	N16 D,
	D 0(N8) = 串口收发器 缓冲区 n,
	D 8(N8) = 串口收发器 缓冲区 n + 1,  //这里忘了加小括号!!!!
	DA转换器 发送数据: D,
	n + 2,
	
	N16 DD = D,
	屏幕 第二行 4 = 0x30 + (N8)( DD % 10 ),
	DD / 10,
	屏幕 第二行 3 = 0x30 + (N8)( DD % 10 ),
	DD / 10,
	屏幕 第二行 2 = 0x30 + (N8)( DD % 10 ),
	DD / 10,
	屏幕 第二行 1 = 0x30 + (N8)( DD % 10 ),
	DD / 10,
	屏幕 第二行 0 = 0x30 + (N8)( DD % 10 ),
	
	...
	
看来语法要改了,或者想个其他办法,至少绝不能现在这样.
-----------------
11月2日 下午 6:31
    把程序语言和组件语言记录到SystemData中，每次新建文件都会自动装载最后一次关于语言的配置；
-----------------
11月3日 下午 5:13
    今天下了一天的雨。下午把组件描述的加载和保存设计好了，单击某个单元格时显示相应的描述，修改后自动更新。
-----------------
11月4日 中午 2:33
    今天又变成下雪了。上午添加了一个预连接特性，比如拖过来一个串口组件，在图形界面会自动把串口组件
的RxD和TxD端口用绿色连接到单片机的PD0和PD1上，表示用户不能连接到别的端口，还有AD组件也是一样，每次拖过来
一个AD转换类的组件，会自动连接到单片机的PA0-PA7上，用户可以选择PA0-PA7的某个端口再连接一次，其他的连线自动消失；
-----------------
11月4日 晚上 7:29
    下午把图形界面的参数配置设计好了，例如拖进来一个串口组件，可以直接在图形界面设置波特率等，拖进来一个
定时器组件，可以设置它的定时间隔。。。编译器自动根据用户的设置进行相应的初始化；

好冷冻死了。。。明天暖和的话赶紧想个办法

**********************************************
2012年12月14日 晚上9:56

下午调试自动流水灯生成器程序的时候把编译器增加了后台运行模式,可以自动编译并下载;不显示界面,用于
和其他外壳程序衔接;
-----------------
2012年12月16日 下午2:29
解决了一个很纠缠的问题,文本改变提示在图形界面更改之后才会有效,以前是只要切换到图形界面就会显示
文本改变. 用一个定时器反复扫描图形界面的代码再和当前的代码比较,如果不一致才触发文本改变操作;

    近期计划: 先设计一个独立的串口程序,测试通过后再集成到编译器中作为一个扩展插件,然后在DLL库中
添加串口操作函数,这样可以在虚拟机中操作串口,再设计 串口转并口控制板,再设计一些虚拟机的定时器等等
常用组件,就可以初步支持上位机编程了.

-----------------
2012年12月16日 晚上10:34
    折腾一个晚上串口,用系统自带的串口,再用封装的,用进程读取,总是慢,有时还死机了....
最后的办法: 采用系统自带的串口,用定时器事件读取数据,把定时器设置为10MS,在读取串口数据中还要
加上try 异常保护,这样还行...下一步是把串口读写封装为事件和接口函数,可以触发虚拟机中的一个中断.

-----------------
2012年12月30日 晚上5:55
    点击一个文件包含(LOAD)的行时,显示一个文件路径链接信息,可以打开包含的文件;



