
-------------------------------------------------
2014年1月1日 半夜 0:25

    很值得纪念的时刻呀...2013年刚刚过去...这个冬天很温暖...

    刚才把图形控件的尺寸调节功能实现了,鼠标移到按钮控件上会在四条边和四个角显示小方框,拖动小方框
就可以调节按钮控件的大小了.还会自动识别最小尺寸,小于最小尺寸会忽略掉,效果非常好

    拖动窗体时上边的所有控件也会被同时拖动,...     (睡觉了... 1:46)

-------------------------------------------------
2014年1月1日 中午2:48
    中午弄了半天!不知怎么的,居然不能播放音乐了,一播放系统就重启,仔细看参数,看汇编库,重启电脑,
都不行!最后发现播放音节的函数提取出来就行,然后把编译器中断函数内存分配从100字节改为150字节,
把调度器的任务数从10减小到5就好了,呜呜... 好纠结! 整整调试了一中午,都快...

    还发现了一个小问题,函数形参名不允许和全局变量相同,这个很重要!现在就开始设计这个检查机制...

--------------------
晚上 7:13
    去掉了ControlPad,全部的接口函数转移到linker中,初步试验了虚拟类型访问,把控件的坐标等改为
虚拟类型,读写坐标时都会在底层发给电脑上位机.下一步是增加尺寸和其他参数等.刚才增加了单片机复位
自动连接,上位机软件不需要重启;

-------------------------------------------------
2014年1月2日 晚上 8:00
    忙了一天,总算把控件的背景颜色解析器设计好了, 在组件配置器中添加了一个图形控件属性列表,
可以设置哪些控件有哪些属性, 图形界面根据这些标志创建相关设置按钮, 初始化时发送给上位机.
用户可以设置按钮和面板的背景颜色;

    下一步是增加控件的文字显示, 用户可以设置按钮的名称等等, 先从英文开始, ...
需要升级编译器的字符编码规则. 目前的只支持英文, 升级为支持英文和中文.

-------------------------------------------------
2014年1月3日 夜里 0:44
    终于加上了中文字符支持, 现在图形控件的按钮可以设置中文名称了.

-------------------------------------------------
2014年1月3日 晚上8:55
    加上了文字颜色属性, 可以设置按钮的文字颜色了,下一步是设计按钮的字体属性...(今天心里有点难受)

23:11 把按钮和文本框的字体设置功能做好了,文本框也隐藏了四角的拖动,只能左右调节宽度,高度通过字体.
好困~~~ 明天去天津...

-------------------------------------------------
2014年1月6日 晚上23:54
    忙了一天终于把图形控件的自动定位功能做好了,用户拖动一个按钮控件时会自动和其他控件边缘对齐,便于放置;

-------------------------------------------------
2014年1月8日 中午 1:01
    上午增加了电脑键盘控件, 用户可以通过这个控件触发电脑键盘的按键, 可以实现幻灯片控制, 电脑关机等等.

-------------------------------------------------
2014年1月9日 晚上 9:18
    增加了图形控件的文字标签(Label), 做了一个温度计测试通过. 发现一个问题: 温度计初始化加上触发温度测量
就会导致系统无法与图形控件同步, 需要去掉才行, 有时间好好测试一下问题在哪.

//2014.1.9 22:53 刚才听音乐时忽然想到为什么不行了, 因为在底层读写变量执行了中断屏蔽和打开...

-------------------------------------------------
2014年1月10日 晚上 9:14
    增加了图形化的注释,可以拖进来一个方框,里边编辑程序的描述信息,可以调节宽度,高度会自动根据文字调节;

-------------------------------------------------
2014年1月14日 半夜 1:07
    今天送她回家. 下午想去网吧玩会儿了, 后来想想还是没有去, 直接回来, 把舵机驱动模块调试好了, 设计了一个
超声波测距控制舵机, 没问题; 晚上添加了滑动条控件, 现在可以用滑动条控制舵机旋转, 而且非常稳定, 不错!
    刚才玩舵机的时候想到一个新控件: 二维的平面机械臂控制控件, 可以用鼠标拖动上边的虚拟机械臂移动; 然后把
虚拟机械臂的两个旋转角发送给下位机的两个舵机, 就可以直观控制真实的机械臂了, 两者是一一对应的.

-------------------------------------------------
2014年1月15日 半夜 11:28
    今天设计了亮度调节模块和电机速度调节模块; 在操作系统加上了周期为100uS的快速驱动接口, 名称为 OS_run100us,
然后设计了三角波发生器组件, 驱动电机和指示灯正常;

-------------------------------------------------
2014年1月16日 半夜 0:55
    做了一个正式一点的机械臂, 用舵机带动, 挺好. 晚上给linka加上了双缓冲面板, 初步加了一个机械臂组件,
测试显示效果正常. 明天好好设计下自定义GUI控件, 要求能和Win控件兼容显示在同一个窗体上, ... 睡觉去了...

-------------------------------------------------
2014年1月17日 半夜 1:55
    上午设计机械臂控制控件, 忙了一天终于OK了, 晚上修改舵机驱动, 打算提高分辨率, 结果整整调试了一个晚上!
这个是调试记录......

//更新时间:2014年1月17日 半夜 0:11
//把代码改为标准C语言形式, 把舵机驱动代码改为内嵌汇编, 提高速度.
//给编译器内核增加了 fast 属性, 用来关闭中断函数的自动保护现场, 进一步增加SPI处理速度, 降低对舵机驱动的干扰;
//调试中发现一个问题(见代码): 把 tick+1 放到 if 语句中就不行! 好纠结! 整整弄了一个晚上! 最后做饭时忽然想起,
//内嵌汇编中不能访问常量! 于是改下编译器内核, 给出常量访问错误提示, 然后就可以把 tick + 1 写到里边了, 好累~~~

    终于改好了, 舵机的单位也设置成360度的度数.

    但是发现有时不稳定, 控制舵机一会儿, 就死机了, 不过指示灯还在闪, 还能软件控制复位, 然后去掉舵机实验, 居然
还是偶尔死机! 看来是程序问题, 不是电源问题. 好好调试下, 或者把连接器设计成单片机主动式, 上位机不再发送
事件标志, 而是由下位机空闲时主动读取事件标志列表再去触发事件, 这样也可以移植到485总线上, 明天试试这个...

    睡觉去了.... 2:01

-------------------------------------------------
2014年1月17日 中午 2:22
    上午弄了半天终于把事件触发机制设计好了, 改成单片机不断向上位机轮询事件标志, 而不是被动接收.
(以前是上位机主动发送事件标志, 移植到485总线上不太好办)
    不过发现反应太慢, 尤其是有鼠标移动事件时导致事件堆栈快速增长, 单片机跟不上, 后来试验了降低波特率等等办法,
最后决定在上位机中过滤掉相同的未处理事件, 比如鼠标移动等.

-------------------------------------------------
2014年1月17日 下午 6:12
    下午调试485通信作为电脑客户端连接器, 给控制板指示灯增加了事件阻塞报警, 当系统事件阻塞超过1秒钟就会闪烁小灯.
发现了一个比较重要的问题需要解决: 刚才实验485通信实现电脑客户端的连接, 按钮控件等都没问题, 但是播放音乐时
系统的事件调度却卡住了, 只有音乐, 但是按钮事件不响应. 然后好好想下忽然想到, 因为在事件循环中增加了主动向上位机
读取事件标志, 但是音乐播放引擎的定时运行驱动也调用了连接器向电脑发送音乐, 导致事件循环中的读取事件标志被中断, 
系统卡住...  然后想了下, 引擎类都会有这个问题, 因为调用的接口是未知的.

    刚才想到, 所有的带有定时驱动的引擎类都要重新设计(目前发现的有音乐播放器和波形发生器), 不允许在定时驱动中
直接调用目标组件的任何函数, 而是添加到一个主循环队列, 交给事件扫描进程去执行. 

-------------------------------------------------
2014年1月17日 晚上 11:24
    晚上把485总线接口调试好了, 关于上边的问题, 最后想到了一个更简单的办法: 在定时驱动中调用连接器通信时, 先检查
连接器忙标志, 如果为忙就建立一个状态机设置好参数并直接退出, 下一次定时驱动运行时再检查是否还为忙状态. 
晚上测试很稳定, 可以播放音乐, 上位机依然可以向控制板发送事件标志.


-------------------------------------------------
2014年1月19日 下午 3:24

    昨天上午把编译器的公共部分提取出来生成一个DLL文件, 这样在linka文件夹下就不再有linkboy.exe了,很整齐.
下午实验舵机控制有问题, 整整找了一个晚上终于发现了, 是舵机驱动的数组下标的最高位为1(协议里设计好的), 导致
给数组赋值时溢出了, 难怪系统一建立连接就重启! 另外还发现了一个BUG: link 类型的变量也分配了地址, 不应该分配的.

    今早上起来开始设计编译器优化部分，居然只用了半天就把变量赋值优化弄好了！测试稳定，原来29KB机器码的程序优化后变成
27KB机器码，挺不错！！！

    然后中午把音乐解码播放引擎改进下，因为加上了100us快速驱动之后，原来的PWM播放器比较慢，本来都打算放弃了，
把重点放在电脑播放音乐上，然后中午忽然想到可以修改延时参数，当采用PWM播放时就自动减小延时值，
这样播放速度提高的部分和系统卡住的延迟正好抵消了！实验OK！把播放器整理下，其中的isBusy和isnNeed不直接访问linker，
而是通过内置的tone接口访问，然后tone根据自身的不同情况，可以把这两个变量设为无效或linker（分别对应硬件播放和电脑播放）
硬件播放的时间变成原来的65%，这样速度刚好相同，不错！！！

	然后试了下485通信，控制小马达旋转，结果居然不行了…… 然后找以前的版本，弄了一中午，其间还停电了，
有点郁闷，用文件比较器找了半天，下午3点钟终于找到问题了，原来是串口通信，加上了一个前导发送函数，问题就在这：

//----------------------------------------------------
//发送前导无效字节, 前导字节作为缓冲. 因为有时候第一个字节会丢失
void SendNullData()
{
	开始发送
	WriteByte( 0x00 );
	WriteByte( 0x00 );
	结束发送
}

不应该加上 开始发送 和 结束发送 两个函数调用，因为在系统重启函数中顺序混了，好马虎，呜呜……

而这两个是不影响 PL2303 的, 因为没有RDE 控制线, 所以不受影响. 看来以后调试程序都要用485和2303都测试通过才行.

-------------------------------------------------
2014年1月19日 晚上 10:36
    把computer.V 类型整理下, 把每个控件的ID设置成常量, 然后在虚拟地址中包含ID, 这样就不需要每个控件都包含一个虚拟V类型,
共用一个就行了, 放置在 linker 中.
    刚才增加了下载完成自动运行linka. 不需要每次手工运行.

-------------------------------------------------
2014年1月20日 下午 5:22
    下午照了一些照片, 中午的阳光给照片添加了不少暖和的色彩. 下午做电子表和温度计, 发现程序不能运行了, 然后检查下原因, 
发现是编译器的变量分配有BUG, 在同一个表达式中应该先分配新变量, 再删除临时变量, 顺序反了. 
以前能运行是碰巧赋值运算不受影响... 因为前两天给编译器增加了赋值优化, 导致这个BUG浮出了水面...

-------------------------------------------------
2014年1月31日 晚上 9:20
    今天是大年初一... 这几天一直在调试云编程机制, 现在可以对函数调用重定向了, 下一步是把云形参好好处理下,
然后测试云函数调用, 和云变量读写... 这几天的情绪一直不稳定, 这个年过的好不踏实呀, 特别特别的难受, 呜呜......

-------------------------------------------------
2014年2月1日 下午 4:29
    修改形参传递机制, 不再需要形参列表, 直接按照顺序传递到局部形参区中, 用到了 st x+, ?? 指令.
不再需要调用关系列表, 各个函数按照顺序分配, 目前理论上应该是支持递归函数了.
传递形参指令中按照标准读取数据, 可以直接传递静态变量到形参, 不再需要以前的二次转移传递, 节省一个赋值指令;
初步测试没问题, ... (需要测试稳定性和兼容性)

-------------------------------------------------
2014年2月2日 下午 4:29

    今天是大年初三 ... 终于初步做好了云编程, 现在是可以在一个芯片区中调用另一个芯片区的函数, 可以传递参数,
明天把带有返回值的函数调用测试好基本就差不多了. 然后就是内存云变量的读写和虚拟云变量的读写.
今天整整纠结了一天! 一开始打算在芯片中建立一个函数表, 当进行云函数调用时传递函数序号; 后来忽然一想可以传递
函数地址呀~ 不过又发现汇编中无法访问其他芯片的函数地址~ 这两个方案整整想了一天, 最后终于采用了后者,
直接传递函数地址, 然后把汇编器的结构修改下, 分成两步汇编, 第一步扫描时计算所有芯片的全部函数地址, 
第二遍扫描直接替换.

-------------------------------------------------
2014年2月4日 晚上6:55
    昨天设计好了带有返回值的函数云调用, 然后在云变量的读写遇到了麻烦, ... 不知道要如何处理了, 好头疼 ...
今天隐隐约约想到, 是否应该把所有的虚拟类型都归结到同一种类型, 指针是通用指针, 每个虚拟变量用地址和索引存放,
索引表示虚拟类型和芯片编号等等, 以及电脑控件ID,... 一个很模糊的想法...

-------------------------------------------------
2014年4月17日 晚上11:42
    这两个多月忙着找工作和换工作, 一直没能静下心来. 今晚上增加了引擎类组件的预连接, 可以显示出接口之间的
匹配关系, 提示用户进行连接. 开始努力吧! 不能再耽误了!!!

-------------------------------------------------
2014年4月22日 上午 11:26
    初步把linkboy改成了两个独立的程序,一个是文本模式, 另一个是图形模式, 分别产生两个exe文件.
现在图形模式下可以打开下载文件了. 图形化软件中, 上午找了半天的窗体设计资料, 最后设计好了不带边框,可以
调节尺寸的窗体, 然后下一步是增加关闭最小化最大化等按钮, 集成到图形控件中, 不用独立的面板.

-------------------------------------------------
2014年4月27日 半夜 0:26
    这几天在完善软件的图形界面部分, 把controlPanel去掉了,现在是纯图形化实现所有控件, 并且在同一个画布上.
增加了一个参数调试界面, 可以调节参数, 用于一些颜色的效果验证. 而以前都是反复编译验证, 比较麻烦~

-------------------------------------------------
2014年4月30日 上午 9:47
    昨天下午调试AM2301, 结果居然不行, 在循环中修改一个未初始化的变量导致错误.
昨晚上用文本比较器找了半天也没发现问题~ 今天上午简化下代码, 终于发现了:
外层变量未初始化导致未分配空间, 在内层循环时为这个变量分配的空间可能在之前已经被某个临时量修改了,
但是因为释放了临时量导致编译器以为这个单元可用. 下一次再从循环起点运行就破坏了这个内存单元. 最后的解决办法:
增加了 "定义变量" 中间指令, 遇到这个指令就立刻分配空间, 而不再使用时才即时分配. 测试通过~

-------------------------------------------------
2014年5月8日 上午 10:00
    增加了 for while dowhile loop forerver 等语句, 修正了 once 语句的一个BUG(不能用continue指令的错误)
    下一步是重写类型系统, 和C语言兼容, 主要是指针类型;

-------------------------------------------------
2014年5月19日 晚上 9:18
    计划把类型系统加上指针类型...... 开始!

-------------------------------------------------
2014年6月25日 下午3:40
    基本完成新版图形化软件, 配套新版的硬件模块类, 接口全部改为6芯接口, 不再需要以前那样单根连接了. 
下午增加了导线预连接, 发现全部的导线包括普通数据端口也显示出预连接比较好, 这样可以区分电机,电源 等.
然后思考另一个关键问题, 就是如何处理AD通道/中断引脚地址/PWM中断函数序号等, 需要识别出端口的序号ID.
计划是编译器图形界面生成一个常量映射, 根据连接端口的ID. 然后忽然想到, 不需要软件特殊处理, 直接把ID
添加到io端口中就行啊! 驱动程序中可以直接读取 端口的ID... 这个解决方式不错啊!

unit P1
{
	public int8 ID = #const 1;
	public link bit D0_DIR = #.MCU.DDRA.2; ...
}

-------------------------------------------------
2014年6月26日 晚上9:38
    设计好了中断端口的自动配置中断, 用超声波模块测试通过, 现在可以使用全部的三个中断端口了...
软件自动根据连接的端口ID去配置相关的寄存器和中断地址. 并且把中断的寄存器改为位操作, 不会影响到
其他模块使用中断寄存器. 另外发现用以前的旧超声波模块不稳定,换成新的就好了.

-------------------------------------------------
2014年6月29日 晚上8:30
    把接口的双向链接处理好了, 现在可以从任意一端向另一端链接, 不区分需求端 和 提供端,
目前有个小问题是暂时没处理接口的外部名称, 全部采用内置名称进行链接(目前内置名称和外部名称相同)
并且接口连接时会进行类型判断, 包括端口方向相同链接提示, 功能不匹配提示等.

-------------------------------------------------
2014年7月
    又换工作了, 中航赛维 -> 视得清 -> 中科院计算所. 7月1日正式上班.

-------------------------------------------------
2014年7月23日 晚上11:30
    把流程类指令独立出来, 只有点击了 OK 按钮准备连接线时才会显示出流程类按钮列表; 目前显示在 OK 按钮
的正下方;

2014年8月11日 晚上10:06
    今天放假结束开始上班, 上午一去就被师兄批评了一顿, 说进度太慢了,... 哎~ 晚上回来的时候, 想着智能指针, 
可以指向任何存储区, 忽然肚子疼了, 瞬间额头冒冷汗~ 好难受~ 去趟厕所就好了, 觉得自己最近怎么这么浮躁呢,
总幻想着以后, 却没有踏实过好此刻, ... 思考着智能指针, 赶紧实现吧, 这个很重要, 非常有用! 加油吧.

2014年8月13日 晚上6:32
    这段时间调试舵机驱动程序, 居然不行了! MEGA8驱动14路舵机, 用以前的版本就行, 后来终于发现了, 是以前的
版本定义RAM存储区为 0x0060, 而后来改成了 0x0100, 估计是想移植到MEGA328芯片的. 刚才把地址重新改为0x0060
就没问题~~~ 而对于MEGA32则是都行. 有时间看看为何改变地址导致MEGA8程序不工作...

2014年8月23日 晚上11:54
    晚上增加了步进触发逻辑模块, 可以输入脉冲, 步进驱动多组指令序列.

2014年10月11日 下午5:07
    增加了初始化清零内存区,一开始写在OS初始化函数中,发现清零最后两个字节就不行, 最后发现那是PC堆栈,
而执行OS初始化已经进入了C环境(发生了第一次函数调用). 最后把清零改到编译器汇编pack函数中就可以了.

2014年10月13日 晚上7:29
    增加了 OS_thread 线程, 用于调度器后台调用, 可以实现数码管和液晶屏清屏时只清屏临时区, 而真正的
显示输出刷新在OS_thread中执行, 防止闪烁, 用数码管显示旋钮调节程序测试通过.

2014年10月15日 下午6:05
    增加了等待指令, 可以支持实现线程的同步, 阻塞, 信号量, 自旋锁等特性.

2014年10月15日 晚上
    把起始界面改成了默认加载一个新文件, 保存时给出提示, 在软件一打开时就可以拖入模块连接.
昨晚还想到一点: 把组件库放置在连接图的下方, 而不是点击一个小按钮. 连接图起名为"实验台", 
组件库起名为"百宝箱", 点击百宝箱中的模块, 界面会平移到实验台的中心用于放置模块.

2014年10月23日
    把一些不必要的组件分离到了linkboy IDE软件中, 图形界面软件只保留必需的组件.

2014年11月1日 下午6:06
    增加了一个自动移动的效果, 添加模块后自动移动到屏幕的中心位置, 防止太远的模块移动好几次.

2014年11月3日
    增加了默认参数设置, linkconst_100_int32... 用于闪烁器, 定时器等, 简化用户工作.

2014年11月15日
    初步完成了表达式类型解析, 图形界面中会根据需求类型自动调用对应的表达式输入框,下一步是完善
字符串, 音乐, 图片等表达式编辑器.

2014年11月29日 下午5:58
    参加英特尔的物联网开发比赛, 抽空把编译器的起始界面显示清空功能实现了, 可以点击一个按钮
清空控制板, 防止控制板上的旧程序干扰外接模块;

2014年12月2日 晚上7:45
    从图形界面程序中移走ctext类, 移到了IDE中, 结构更加清楚了, 为将来的移植做好了一个准备.


