📄 avrrtos技术文档.txt
字号:
各位好!
多谢你阅读、学习或使用本操作系统。
本次公开的操作系统暂时命名为 Mini Rtos AVR v1.00 Bate 测试版本
本操作系统比上次的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(关闭)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -