![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 我编写的第二个基于AVR的嵌入式操作系统调度内核现在公开测试 | |||||
作者:61IC录入 文章来源:本站原创 点击数: 更新时间:2006-4-7 ![]() |
|||||
|
本操作系统比上次的Mini X C51有质的飞跃! 因为是重写并不是移植!并且公开全部源代码! 本系统并未进行过硬件测试,只通过AvrStdio 4的模拟运行, 因此如果你发现本系统出现错误或缺陷请你及时通知我, 我会尽快修改。 还有我收回本系统的所有权!请大家尊重知识产权! 1、操作系统介绍 本操作系统为实时嵌入式操作系统(占先式),目前支持AVR CPU 编译器为GNU GCC 3.3 for Avr 就是大家熟悉的WinAvr加上ElftoCoffbate 补丁文件,makefile文件是从补丁中获得的。IDE界面为PN,WinAvr自带那个, 不过是最新版本是免费下载的。设计支持芯片为Atmage8,如果你需要支持 其他芯片,或者使用其他TICK信号默认为T0,请你修改内核文件以获得支持。 2、操作系统的特点 本操作系统可以提供256条线程,256个优先级(每条线程的优先级必须唯一 )必须建立一条最低优先级的空闲线程,该线程可以作为统计或者低功耗处理, 但必须存在。并且不能带有OS_TASK_DLY()函数使其进入等待状态。 每条线程都必须为无限循环函数,如果你需要停止该线程,可以改变他的动作 标志位。空闲线程不能停止。 2、操作系统文件说明 本操作系统带有两个文件一个为C文件(MXAVR.C),另一个为汇编文件 (OS_CPU.S).具体两个文件的修改方法在该文件上都有说明. 用户使用时有一个地方必须修改就是 #define TASK_NUMBER 4 是用来记录用户所建立的线程数目其中包括空闲线程 如果用户需要修改时钟节拍,就需要修改两个C函数 inline void OS_START_TICK(void);//启动RTOS void OS_RELOAD_TICK(void);//重新初始化系统时钟 如果用户需要更改节拍源,就需要修改汇编文件中的 ;中断入口 .global SIG_OVERFLOW0 ;中断入口点 用户根据情况修改 SIG_OVERFLOW0: ;中断入口点 用户根据情况修改 以确定中断入口 3、操作系统的函数说明 操作系统提供用户使用的函数只有4个分别为: OS_CREATE_TASK() 建立线程函数 OS_START_TICK() 启动操作系统 OS_GET_TASK_ID() 获取线程ID OS_TASK_DLY() 线程等待 其它函数都是操作系统内部使用 操作系统是以线程TCB为基础,每条线程都拥有自己的TCB.而TCB是建立在 OS_TASK_ARRY[]数组里面.所以只要你获得线程ID就可以对该线程进行修改. 4、使用操作系统的要点 在使用操作系统时必须明确使用的必要性。使用时尽量减少建立无谓线程,以 节省RAM资源。小心安排每条线程的堆栈区域,慎防出现线程堆栈重叠情况。这需 要长时间的现场调试!!! 在OS_START_TICK()前完成所有线程的建立工作。本系统不支持重入函数操作, 如果的确需要使用,那么你就需要确保所有线程都在一个时钟TICK内完成,就是 在一个TICK内所有线程都已经调用了OS_TASK_DLY()函数并且所有被调用的可重入 函数都已经返回,空闲函数除外。不过空闲函数是不能调用重入函数和OS_TASK_DLY()的。 如: void task_1(void) { for (;;) { fun1(); //调用重入函数1 (必须在一个时钟节拍内完成) fun2(); //调用重入函数2 (必须在一个时钟节拍内完成) fun3(); //调用重入函数3 (必须在一个时钟节拍内完成) OS_START_TICK(1); //进入等待状态,等待一个时钟节拍,此时会调入下一条线程执行 } //假设下一条线程为task_2 } void task_2(void) { for (;;) { fun1(); //调用重入函数1 (必须在一个时钟节拍内完成) fun2(); //调用重入函数2 (必须在一个时钟节拍内完成) fun3(); //调用重入函数3 (必须在一个时钟节拍内完成) OS_START_TICK(1); //进入等待状态,等待一个时钟节拍,此时会调入下一条线程执行 } //假设下一条线程为空闲函数了 } //空闲函数 在一个TICK未结束前必须进入到空闲函数。否则fun1,fun2,fun3里面的变量会被从新刷写 void task_free(void) { for (;;) { fun1(); //错误 空闲函数是不能调用重入函数 fun2(); //错误 同上 fun3(); //错误 同上 OS_START_TICK(1); //错误 空闲函数是不能调用OS_START_TICK()函数 sleep(); //让它休息是个好主意 } } 同时fun1 fun2 fun3里面的变量不能为静态。 判断可重入函数和不可重入函数是有方法的,可重入函数是不能操作一个固定的RAM地址或IO口。不可重入 函数操作的是一个固定的RAM地址或IO口,所以带有静态变量的函数就不是可重入函数。 在线程内部变量声明问题。由于C编译器会重用或共用RAM空间,所以线程变量 必须声明为静态不可优化类型 如: unsigned char i; 应声明为 volatile static unsigned char i; 对于一些可重入函数但是又只有一条线程调用,而没有被重入.那么建议将它内部的变量都声明为不可优化 静态变量,这样可避免编译器分配出相同地址而出现的数据意外刷新.毕竟这个版本不支持重入函数,请各位谅 解! 5、关于MAKEFILE的一些说明 我的MAKEFILE是修改他人编写的,所以我发现一个奇怪问题。添加OS_CPU.S汇编文件时,必须把扩展名改为 OS_CPU.O否这会出现无法连接现象。请大家注意!还要注意优化级别的选择,这个我还没有细心研究过。不过 同的优化级别出来的代码完全不同,大家要明确这一点。在MAKEFIEL中我把它设为0(关闭) |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 没有相关文章 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|