

//linkboy专用
//嵌入式操作系统 - votex

//此调度器是一个协作式操作系统,分为内核和外层,内核部分运行各个组件的驱动程序,采用
//定时器驱动,驱动执行频率为1000Hz(每隔1ms扫描所有驱动进程)
//外层部分反复扫描全部的任务代码,每个任务具有独立的栈空间,通过"schedule"调用进行切换.

//...注意事项
// * 凡是修改 SP 的地方都需要加上关中断保护

//...版本记录
//2012 初始版本
//2013.2.18 把内核驱动从静态代码改为动态注入方式
//2013.2.28 增加了事件退出保护沙箱,在图形界面配置中不需要保护代码

//2013.6.16 定时器中断 注释掉 //MCU TIFR = 0b0000_0010, 需要测试系统是否稳定

//2013.10.31
//把调度器改成了适合图形化编程的方式,每个事件脉冲流退出后不会自动重新执行,
//可以动态添加事件脉冲流.

//2014.1.14
//增加了快速驱动运行机制, 可以注入100us的驱动到内核中; 以前的版本最小的驱动运行间隔为1000us
//主要为了支持电机调速, LED灯光亮度控制等高速驱动的运行

//2014年1月18日 半夜 11:58
//给调度器增加了一个警戒线, 只要进程池被冲破就会触发报警, 把TCB中重要的数据放到后边,数组放前边

//2014年10月12日 上午9:52
//调试编码旋钮, 发现旋转过快系统卡住, 一开始以为是中断干扰, 后来发现是因为正反旋转事件中
//调用了延时指令, 任务创建过快导致线程池满, 于是在 CreateTask 中增加了判断, 
//如果线程池满的话就调度一次, 直到释放掉现有的某个线程.

//2015年3月2日 晚上9:31
//增加了事件资源计数器, 这样可以识别一个事件是否正在执行, 防止事件重入导致代码前后冲突; 图形界面
//中每个事件自动生成一个计数器, 创建一个进程时就会被进程中的计数器指针锁住, 直到进程退出为止.
//用旋钮调节音调程序测试通过, 效果非常好.

//2015年3月26日 下午
//准备把操作系统移植到MEGA644上, 并且兼容MEGA32
// * //MCU.SFIOR.2(bit) = 1; 这里不对, 设置为1反而是禁止上拉电阻

//2016年6月9日 端午节
//把虚拟机PC地址从2字节改为了3字节, 为了将来的大程序做准备

2018年4月16日
实现了事件的删除操作, 立即移除指定的事件进程, 主要是为寻迹车分支路径程序, 状态机切换等做支撑

//2018年5月25日
终于解决了一个重要BUG, 正常运行时添加事件后, 调用Schedule并不一定会立刻执行刚加的事件.
之前做弹球游戏时禁用定时器事件后, 有一定几率系统还会执行一次定时器事件导致冲突. 
现在增加了TrigEvent函数可以立刻触发刚添加的事件.




