《AVR实时操作系统》word版
freertos 讲解

freertos 讲解**FreeRTOS讲解******FreeRTOS是一个开源的实时操作系统,广泛应用于嵌入式系统。
在本文档中,我们将深入探讨FreeRTOS的核心特性、优势及应用场景,帮助您全面了解这一强大的操作系统。
**一、FreeRTOS简介**FreeRTOS是一个免费的实时操作系统,由Real Time Engineers Ltd.维护。
它遵循MIT开源协议,可以免费用于商业和非商业项目。
FreeRTOS支持多种硬件平台,如ARM、AVR、MSP430等,具有高度可扩展性和模块化特点。
**二、FreeRTOS核心特性**1.任务管理:FreeRTOS采用基于优先级的任务调度算法,支持多任务并发执行,确保高优先级任务能够及时获得处理器资源。
2.时间管理:FreeRTOS提供了精确的时间管理功能,包括定时器、延时函数等,以满足实时性要求。
3.内存管理:FreeRTOS提供了动态内存分配和回收机制,支持堆内存管理,以满足不同任务的内存需求。
4.通信机制:FreeRTOS支持多种通信机制,如信号量、互斥量、消息队列等,用于任务间的同步和数据传递。
5.中断管理:FreeRTOS允许在中断服务程序中调用操作系统服务,提高了中断处理的实时性。
6.可扩展性:FreeRTOS支持多种硬件平台,用户可以根据需求添加或删除功能模块,实现高度定制化。
**三、FreeRTOS优势**1.开源免费:FreeRTOS遵循MIT协议,可以免费使用,降低了开发成本。
2.实时性:FreeRTOS具有优异的实时性能,能够满足各种实时性要求较高的应用场景。
3.跨平台:FreeRTOS支持多种硬件平台,方便开发者进行跨平台开发。
4.易用性:FreeRTOS提供了丰富的API接口,易于学习和使用。
5.社区支持:FreeRTOS拥有庞大的开发者社区,可以获得丰富的技术支持和资源。
**四、FreeRTOS应用场景**1.嵌入式系统:FreeRTOS广泛应用于嵌入式领域,如智能家居、工业控制、医疗设备等。
v5.0操作手册

目录系统简介 (1)一.功能简介 (2)11录像功能 (2)12视频显示 (2)13报警功能 (2)14控制功能 (3)15管理功能 (3)16日志 (3)17电子地图 (3)28网络功能 (4)二.使用说明 (4)21系统初级使用说明 (4)22系统高级使用说明 (13)22.5电子地图 (19)三.客户端使用说明 (21)31软件介绍 (21)四.运行操作: (21)41客户端的配置 (22)42客户端日志的管理 (25)五.硬件 (28)51硬件安装 (28)52系统主机外接设备连接图 (29)53联动报警的实现 (29)54解码器列表 (30)结束语 (31)系统简介V5.0系列数字监控系统是当今多媒体、图像处理、计算机等各项最新技术高度结合的产品。
V5.0系列数字监控系统以计算机为中心,图像数字处理为基础,实现图像监视系统的小型化、高清晰度化、自动化和网络化。
给图像监视工程提供了更优的性能、更灵活的系统组建、更好的系统管理,是图像监视系统从模拟到数字的一个质的飞跃。
它利用最新的图像数字处理技术将模拟视、音频信号转化为数字信号,在计算机显示器上实时显示1—36路以上活动图像的同时,在压缩时将各路视、音频信号分别存储于计算机硬盘内,在计算机上实现信号的监视、记录、回放。
它对视、音频信号采用MPEG-4编码,完全动态码流,使相同质量的录像资料保存时占用更小的空间。
本系统软件支持MPEG1、MPEG2、MPEG4、H.264、D1等算法的程序应用,按硬件的配置,可以满足图像录像质量720×576、1024×768分辨率的要求,而且具完全实时效果,并最大限度地实现了网络传输无极限扩展功能,IE浏览与数据传送等强大功能。
所以它可以应用在银行、电力、电信、交通、军队、智能小区、商业场所、公检法机关,医疗教育系统等领域。
一.功能简介11录像功能1.1.1最大视频/音频处理能力监视和记录帧数 25帧/秒/路摄像机输入 1-36路输入,1V峰值电平,75欧姆BNC端口视频信号格式 PAL/NTSC ,彩色、黑白图像压缩 MPEG-4/D1、像数720×576、352×2881.1.2录像激活方式方式一:预约方式,在事先设定好的录像时间内进行录像,录像时间可按照一周的每一天的每一小时进行设置。
实时操作系统 AVRX 的使用

实时操作系统 AVRX 的使用
王刚;许海坤
【期刊名称】《电子技术与软件工程》
【年(卷),期】2013(000)009
【摘要】本文首先介绍如何在 WinAVR环境下编译 AVRX,接着给出在AVRStudio 中配置 AVRX 的详细步骤,最后详细叙述了如何编写AVRX 的应用程序。
本文可作为AVRX 初学者的入门参考。
【总页数】2页(P28-29)
【作者】王刚;许海坤
【作者单位】
【正文语种】中文
【中图分类】TP316.2
【相关文献】
1.不使用实时操作系统实现任务定时切换 [J], 袁建州;王智晶;于丽娜
2.嵌入式实时操作系统DSP/BIOS使用方法的研究 [J], 武二永;孙明明;杨克己
3.AVR单片机的RTOS-AVRX应用 [J], 卫进
4.基于AvrX操作系统的机器人控制系统设计 [J], 张黎夫;李宏亮;苏毅婧
5.实时操作系统CPU使用率监测的软件容错研究 [J], 王余伟;曹东;施书成
因版权原因,仅展示原文概要,查看原文内容请购买。
AVR单片机实时系统内存分配算法的研究_王家亮

收稿日期:2010-03-12基金项目:国家自然科学基金资助项目(60973022);教育部高等学校科技创新工程重大培育资金资助项目(708026)#作者简介:王家亮(1983-),男,辽宁辽阳人,东北大学博士研究生;赵 海(1959-),男,辽宁沈阳人,东北大学教授,博士生导师#第32卷第5期2011年5月东北大学学报(自然科学版)Journal of Northeastern U niversity(Natural Science)Vol 132,No.5M ay 2011AVR 单片机实时系统内存分配算法的研究王家亮,赵 海,潘 荣,蔡鹏华(东北大学信息科学与工程学院,辽宁沈阳 110819)摘 要:由于AV R 单片机存储资源十分有限,因此对内存的分配及使用会直接影响到整个系统的性能#对设计并实现的嵌入式操作系统iDCX 128的内存分配进行了测试,结果表明由于系统采用首次适应算法,在进行多次内存分配后,内存空间利用率不高#因此对其内存分配算法进行改进,通过修改内存区存储任务的堆栈结构及分配机制,使其成为最佳适应算法#实验结果表明改进后算法虽然浪费少量存储单元,并相应地增加了算法执行时间,但内存的整体利用率却得到了较大的提高#关 键 词:实时系统;内存分配;执行时间;内存空间利用率;系统测试中图分类号:T P 316.2 文献标志码:A 文章编号:1005-3026(2011)05-0654-04Studies on the Memory Allocation Algorithm of an AVR Single Chip Rea-l Time SystemWAN G J ia -liang,ZHA O H ai,PAN Rong,CAI Peng -hua(School of Information Science &Engineering,Northeaster n U niv ersity,Shenyang 110819,China.Corresponding author :WAN G Jia -liang,E -mail:wang jialiang -neu @y )Abstract :Given the limited capacity of AVR single chip memory,memory allocation and utilization can directly affect entire system performance.M emory allocation testing of a sel-fdesigned embedded operating system iDCX 128indicated that system memory -space utilization efficiency was low after numerous memory allocation events due to use of a first fit algorithm.The memory allocation algorithm w as improved by altering the structure of tasks stored in the memory and the allocation mechanism w as m ade into a best fit algorithm.Ex perimental results demonstrated that the improved algorithm caused a small number of w asted storage units w ith a corresponding increase in ex ecution time.Nevertheless,overall memory utilization was g reatly improved.Key words:rea -l time system;memory allocation;ex ecution time;memory -space utilization;system test内存分配算法分为静态和动态两种,如果系统对实时性和可靠性要求很高(如硬实时系统),不能容忍一点延时或者一次分配失败,当然需要采用静态分配算法,即在程序编译的时候将所需要的内存分配好#而实际上大多数应用则是硬实时系统和软实时系统的结合,而在这样的系统中,大多采用动态内存分配算法来满足实际应用要求[1-4]#因此,本文主要讨论动态内存分配算法#1 单片机动态内存分配算法1)首次适应算法#每次分配都从内存空闲分区链的头节点开始查找,找到第一个满足要求的空闲节点,然后将其分配#这种算法的优点是执行时间短,但是容易形成碎片,出现内存空间分配不均的现象#2)循环首次适应算法#循环首次适应算法基本思想和首次适应算法类似,区别是每次分配后都记录分配的下一个节点信息,下次分配时从记录的节点开始查找#这种算法在某种程度上解决了内存空间分配不均的情况,但是其形成的循环链表增加了复杂度#3)最佳适应算法#分配时从内存空闲分区链的头节点开始查找,找到能满足要求的最小的空闲节点,将其分配,这种算法虽做到了/量体裁衣0,但耗时相对长些[4]#2 测试系统iDCX 128汇编语言的一条指令就对应一条机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便[5]#故选择AVR 汇编语言来实现此系统内核iDCX 128#2.1 操作系统内核模块功能及特点iDCX 128系统内核是基于优先级抢占式的,主要完成任务管理、任务间的通信服务、中断处理服务和计时服务等,这些服务主要通过系统调用来实现,如表1所示#iDCX 128系统内核特点有:具有实时多任务执行能力;支持远程通信能力;程序优化占用空间小;可靠性高;具有简单的用户接口;与位总线分布式控制模块系列产品相兼容#2.2 iD CX 128系统的内存分配算法1)iDCX 128系统初始化时内存管理#系统初始化时,系统内存区(SMP)被创建和修改#首先执行SUB1子程序(释放缓冲块)来创建SMP,当初始化需要创建任务时,系统需要用CREATE10子程序(申请缓冲块)在SMP 的顶部为这些任务表1 iDC X 128系统内核的组成Table 1 The structure of iDCX 128system core 功能模块包含的系统调用任务管理1.创建任务系统调用2.删除任务系统调用3.了解任务的功能ID 号系统调用中断处理1.屏蔽中断系统调用2.开放中断系统调用3.中断处理系统调用任务间通信1.申请缓冲块系统调用2.释放缓冲块系统调用3.传送消息系统调用计时服务1.建立时间间隔系统调用2.等待系统调用创建特定长度的堆栈,最后系统缓冲区(SBP)被创建#2)iDCX 128系统动态的内存管理#当系统试图创建一个新任务时,如果SMP 中剩余的内存不够为此任务分配堆栈,这时系统需要通过连续调用SUB1子程序来释放SBP,并将其归还给SM P,然后再通过CREATE10子程序来为任务分配它所需要的堆栈,分配后,系统再从剩下的SM P 中创建SBP #例如,系统最初分配了起始地址为016AH 、长度为116的SMP(见图1a);当系统创建第一个任务TASK1时,SM P 循环调用CREATE10子程图1 系统的内存分配示意图Fi g.1 Memory allocation of sys tem(a))初始分配;(b))创建第一个任务;(c))创建第二个任务#655第5期 王家亮等:AVR 单片机实时系统内存分配算法的研究序来分配出5个SBP 之后,剩余8个空闲单元(见图1b);当系统创建第二个任务TASK2时,系统循环调用SUB1子程序把5个SBP 释放后,再为TASK2分配堆栈,然后SMP 循环调用CREATE10子程序来分配出4个SBP,之后剩余18个空闲单元(见图1c)#整个过程中,系统所分配的SBP,其地址都是互相链接的,即SBP 中有两个存储单元用来记录下一个SBP 起始地址#3)iDCX 128系统内存分配算法的改进#iDCX 128系统的内存分配,其原算法采用的是首次适应算法,本文对其进行了改进,对每个任务的堆栈在原有的前一内存块起始地址链接Link 和被分配的内存空间Space 的基础上增加两部分信息,即占用标识Tag 和内存块大小Size,使之成为最佳适应算法#这样虽然略微增加了内存分配的存储开销,但是能够使系统在每次内存分配时,总能分配到满足分配要求的最小空闲节点#修改后的内存分配格式块如图2所示#图2 改进的内存分配F i g.2 Improved memory allocation由于系统最大支持8个任务,因此不会占用太大的额外存储空间#这样,在回收内存块的时候,更容易判断某一空闲内存块所处的物理位置上,其前面和后面的内存块的占用情况,这样处理是为了便于合并成一个尽可能大的空闲内存块[6-7]#其处理过程如图3所示#实现该算法分配的具体过程如下:步骤1 获得空闲存储分区的首地址,查找空闲节点的首地址,并存入Butter -tab 存储表中#步骤2 比较当前空闲节点与要申请的分区大小,若等于要申请的,则进行记录并分配,之后退出循环#步骤3 若大于要申请的,则先记录此节点的地址,存入在Fit -tab 存储表中#并在每次循环时进行更新,将小于Fit -tab 存储表中数值的空闲节点地址写入Fit -tab 存储表中#步骤4 若小于要申请的,则继续查找下一个更合适的空闲节点#步骤5 重复循环,直至找到最合适的空闲节点为止#即若找到空闲节点的大小正好等于要申请的分区,则直接分配此空闲节点;若未找到,则将Fib_tab 存储表中记录的空闲节点进行内存分配#图3 改进的内存分配处理过程F i g.3 Proces s of impr oved memory allocation2.3 iDC X 128系统的内存分配测试对实现的iDCX 128系统进行内存分配测试,考虑到系统的实时性及内存空间利用率的重要性,本测试主要对算法的执行时间和内存空间利用率两项指标进行测试[8-10]#算法的执行时间即指系统执行此内存分配程序所需要的时间#采用的测试工具是示波器(TDS5054B),测试方法为:系统创建一个任务TASK1,在其内存分配子程序的开始处,添加外部I/O 口的输出语句,设置A 端口PA2引脚为高电平,并在内存分配子程序的结束处,添加外部I/O 口的输出语句,设置A 端口PA2引脚为低电平,来使外部I/O 口的输出状态有所变化#然后通过示波器的高低电平变化曲线时间点,计算出其内存分配时间,TASK1及应用程序在创建及执行的过程中,均未对A 端口PA2引脚的电平进行改变#通过系统多次调用TASK1,来分别对原始的和改进后的内存分配算法进行内存分配时间测试,采用多次测试然后计算其平均值的方法,系统内存分配算法的执行时间测试结果如表2所示#从测试结果可知,修改后的最佳适应算法,其内存的分配时间有所增加,其主要是由于修改后的内存分配算法,增加了占用标识Tag 和内存块的大小,并相应的增加了Butter -tab 和Fit -tab 存储表的数据存储空间,从而浪费了系统内存分配的执行时间#内存的空间利用率是指经过若干次内存分配与回收后,系统内存的剩余空间(不包括两次分配的内存块之间的碎片)和系统总的内656东北大学学报(自然科学版) 第32卷存大小的比值[10]#测试时主要通过统计计算AVR Studio4(系统仿真软件)中的内存块区域(Memory1~M emory4)窗口的内存单元使用情况,进而统计数据,计算得出其内存空间利用率#系统内存空间利用率测试结果如表3所示#表2执行时间测试Table2Test of execution time L s 算法20次40次60次80次首次适应算法9172430最佳适应算法14263752表3内存空间利用率测试Table3Tes t of m em ory-space uti lization%算法20次40次60次80次首次适应算法96.594.491.186.4最佳适应算法97.396.595.494.2从测试结果可知,在系统内存循环分配次数比较少时,首次适应算法和改进后的最佳适应算法二者的内存空间利用率相当,但是随着系统内存循环次数的不断增多,最佳适应算法的内存空间利用率较首次适应算法优势明显#由于改进后的算法很好地处理了内存回收块的选择,因此较好地解决了内存空间利用不均的现象#算法的数据分析表明:改进后的iDCX128系统的内存分配算法,由于增加了每个任务的堆栈及相应的存储表空间,从而浪费了少量的存储单元,因此导致内存分配的执行时间也有所增加,但是测试数据结果表明内存的整体利用率却得到了较大的提高#3结语本文对iDCX128系统的原始内存分配算法进行了改进,改进后的算法以适当的牺牲算法的执行时间为代价,提高了整个内存空间的利用效率#由于8位AVR单片机处理器本身处理速度的限制,其实际应用时对整个内存空间利用率的要求与对执行时间的要求相比,显得更重要些,因此改进后的iDCX128系统内存分配算法更适合实时系统的具体应用需要#参考文献:[1]赵海,陈燕#普适计算[M]#沈阳:东北大学出版社,2005:1-8#(Zhao Hai,Chen Yan.Pervasive computing[M].Sh enyang:Northeastern University Press,2005:1-8.)[2]Abow d G D,M ynatt E D.Charting past,present and futureresearch on ubiquitous computing[J].A CM Tr ansaction onComp uter-H uman Interaction,2002,7(1):29-58. [3]Xu G Y,Shi Y C,Xie W K.Pervasive com puting[J].Comp uter Jou rnal,2003,26(9):1042-1052.[4]Liu J W S.实时系统[M]#北京:高等教育出版社,2003:52-73#(Liu J W S.Rea-l time systems[M].Beijing:H i gherEducation Press,2003:52-73.)[5]张希元,赵海,孙佩刚#WebitOS内核的实现机制及性能分析[J]#东北大学学报:自然科学版,2006,27(4):394-397#(Zhang X-i yuan,Zhao Hai,Sun Pe-i gang.Realizationmechanism and performance of WebitOS kernel[J].Jour nalo f N orthe aster n Univ ersity:Natural S cience,2006,27(4):394-397.)[6]Nieplocha J,Tipparaj u V,Kri shnan M.High performanceremote memory access communication:the armci approach[J].In ternational Journal o f Hig h Perf or mance Comp utingApp lic ations,2006,20(2):233-253.[7]Zheng H Z,Lin J,Zhang Z,et al.Decoupled DIM M:building high-bandwidth memory sys tem usi ng low-speedDRAM devices[J].A CM SI GAR CH Compu ter A rchitectureNew s,2009,37(3):255-266.[8]Ozturk O,Kandemir M,Irw in M ing data compressionfor increasing memory system utilizati on[J].I EEET ransactions on Computer-A id e d Desig n of I ntegratedCircuits and Systems,2009,28(6):901-914.[9]Li H L,Yang C L,Tseng H W.Energy-aware flashmemory management i n virtual memory system[J].I EEET ransactions on Very L arge Scale I ntegration(VL SI)Systems,2008,16(8):952-964.[10]M utl u P,M oscibroda P.S tal-l time fair memory accessscheduling for chip multiprocessors[C]M Proceedings of the40th Annual IEEE/ACM International Symposium onM icroarchitecture.W ashinston D C:IEEE ComputerSociety,2007:146-160.657第5期王家亮等:AVR单片机实时系统内存分配算法的研究。
AVR单片机实时操作系统AvrXRTOS.doc

AVR单片机的RTOS-AVRX应用摘要:详细介绍AVR系列单片机的专用实时嵌入式操作系统AVRX的特点,并以ATmega16单片机为平台,结合AVR单片机应用实例分析AVRX的内核代码及移植方法,并对系统的相关性能进行测试。
采用AVR X可以大大简化程序设计,满足实时要求,降低编程难度,提高系统可靠性。
本文为在AVR单片机上进行嵌入式系统开发提供了参考。
关键词: RTOS AVRX AVR单片机移植系统测试引言随着技术的发展,嵌入式系统的设计及应用对人们的生活产生了很大的影响,并将逐渐改变人们未来的生活方式。
在特定的操作系统上开发应用程序,可以使开发人员忽略掉很多底层硬件细节,使得应用程序调试更方便、易于维护、开发周期缩短并且降低开发成本,因而嵌入式操作系统深得开发人员的青睐。
AVR微处理器是Atmel公司开发的8位嵌入式RISC处理器,它具有高性能、高保密性、低功耗、非易失性等优点,而且程序存储器和数据存储器可独立编址,并具有独立访问的哈佛结构。
AVR单片机内核有丰富的指令集,通过32个通用寄存器直接与逻辑运算单元相连接,允许在一个周期内一条单一指令访问两个独立的寄存器,这样的结构使代码的执行效率比传统的复杂指令集微处理器快了将近lO倍。
AVRX是由lbarello编写的源码公开的嵌入式操作系统,它专门针对AVR系列单片机的RTOS,具有免费和可以修改的特点。
它的缺点是由于做为一种专用的操作系统很难移植到其他平台上。
1 AVRX系统的特点AVRX做为AVR专用RTOS有如下的特点:◆完全支持占先式、优先级驱动的任务调度算法;◆16个优先级,相同的优先级的任务采用Round-robin调度算法轮流执行;◆信号量可以用于信号传递、同步和互斥信号量,支持阻塞和非阻塞语法;◆任务之间可以用消息队列相互传递信息,接收和确认消息可以用阻塞和非阻塞调用;◆在中断子程序中,大部分非阻塞的中断服务程序可以使用;◆支持单个定时器的时间队列管理,任何进程都可以设置一个定时器,并且任何一个任务都可以等待定时器时间到;◆支持单步调试运行着的进程;◆程序空间小,包含所有功能的版本占用1000字节;◆与定时器/计数器有关的一些事务可以用AVRX写成任务级代码。
AVR的操作步骤和应用

动手学A VR单片机一、AVR单片机家族概述1.1 AVR单片机家族单片机概述AVR单片机系列齐全,可适用于各种不同场合的要求。
AVR单片机主要包括ATTINY、AT90、ATME GA这三大系列。
低档Tiny系列AVR单片机: 主要有Tiny11/12/13/15/26/28等;ATTINY系列最简单、功能最弱。
适用于比较低档的玩具、仪器仪表和简单的控制系统。
中档AT90S系列AVR 单片机: 主要有AT90S1200/2313/8515/8535等;目前AT90系列正在停产或转型到Mega系列。
高档ATmega系列AVR单片机: 主要有两个系列:ATmega8/16/32/64/128系列(存储容量为8/16/32/ 64/128 KB)、ATmega48/88/168系列。
ATmega系列使用了更加先进、可靠的制造工艺,高中低档齐全,正在逐步取代AT90系列的产品。
AVR单片机还根据不同的应用推出了各具特色的单片机:如汽车类AVR、CAN总线AVR、智能电池A VR、LCD(液晶显示)AVR、USB总线AVR、灯光专用AVR、Z-Link AVR、微型AVR等9大类型,这些单片机几乎涵盖了8位单片机的所有应用领域。
1.2 AVR单片机的型号与编号AVR单片机型号众多,基本上每种型号都有不同用途,每个系列AVR单片机芯片上都有不同的编号;如何根据芯片上的编号来识别呢?我们以下面这个编号为例来进行说明:ATmega8L-8PI1.AT表示该单片机是ATMEL公司的产品;2.mega表示该单片机为ATmega系列的单片机;3.数字8表示mega系列型号为8的单片机,同时指名了该型号单片机内部flash容量位8KB(8K字节)。
4.字母L表示该单片机为低功耗类型的单片机,同理如果没有L,则表示该单片机为普通类型的单片机;5.“-”后面的数字8表示该芯片允许的最大时钟频率为8MHz,如果是16则表示允许最大时钟频率为16M Hz;6.字母P表示该单片机的封装形式,P是DIP封装(双列直插),A表示有引脚扁平封装(即贴片封装),M表示无引脚扁平封装(对于个人学习,很少使用这种封装)。
2019年AVR实时操作系统.doc

写的不错~~本人正在学习中~~有兴趣的顶下~`我将继续补发后面的~~~第一篇:函数的运行第一篇:函数的运行在一般的单片机系统中,是以前后台的方式(大循环+中断)来处理数据和作出反应的。
例子如下:makefile的设定:运行WinAvr中的Mfile,设定如下MCU Type: mega8Optimization level: sDebug format :AVR-COFFC/C++ source file: 选译要编译的C文件#include <avr/io.h>void fun1(void){unsigned char i=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}int main(void){fun1();}首先,提出一个问题:如果要调用一个函数,真是只能以上面的方式进行吗?相信学习过C语言的各位会回答,No!我们还有一种方式,就是“用函数指针变量调用函数”,如果大家都和我一样,当初的教科书是谭浩强先生的《C程序设计》的话,请找回书的第9.5节。
例子:用函数指针变量调用函数#include <avr/io.h>void fun1(void){unsigned char i=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}void (*pfun)(); //指向函数的指针int main(void){pfun=fun1; //(*pfun)(); //运行指针所指向的函数}第二种,是“把指向函数的指针变量作函数参数”#include <avr/io.h>void fun1(void){unsigned char i=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}void RunFun(void (*pfun)()) //获得了要传递的函数的地址{(*pfun)(); //在RunFun中,运行指针所指向的函数}int main(void){RunFun(fun1); //将函数的指针作为变量传递}看到上面的两种方式,很多人可能会说,“这的确不错”,但是这样与我们想要的RTOS,有什么关系呢?各位请细心向下看。
AVC自动电压控制系统运行操作事项

A VC自动电压控制系统运行操作事项1.A VC的投、退操作必须按照中调命令执行,特殊情况申请中调同意后进行,事故处理退出单一机组A VC时应及时汇报及时恢复。
2.A VC后台机在二期值长操作台,A VC投退操作正常由一期值长(助理值长)下令,由二期值长(助理值长)进行投退。
与中调的汇报联系由一期值长(助理值长)负责。
3.一期机组A VC必须在机组达到80MW负荷前投入,二期机组A VC必须在机组达到130MW负荷前投入(机组在设定负荷以下A VC功能会自动闭锁)。
机组停机后或励磁装置故障时,A VC会自动退出,检查未退出时在DCS上退出A VC(#1机组在停机后,A VC投入把手应切换至手动位置)。
A VC投入后必须加强对机组无功负荷及各系统电压电流的监视,发现异常及时处理。
4.A VC功能的实现方式:通过GR90-RTU系统上的A VC功能模块,由远动工作站接收A VC主站下发的电厂高压母线目标控制值或各机组的无功出力目标值,A VC子站系统通过A VR/DCS系统向发电机的励磁系统发送增减磁信号以调节发电机无功出力。
5.A VC正常时均投全厂控制模式(中调默认电压目标调节),即A VC子站系统接收A VC主站系统下发的电厂变高侧母线电压控制目标值后,根据电压控制目标值,按照一定的控制策略,通过计算自动得出电厂需要承担的总无功功率,将总无功功率合理分配给对应每台机组,A VC子站系统通过A VR/DCS 系统向发电机的励磁系统发送增减磁信号以调节发电机无功出力,使电厂变高侧母线电压达到控制目标值,实现全厂多机组的电压无功自动控制。
6.根据中调令也可以投单机控制模式(无功目标调节),即AVC子站系统直接接收AVC主站系统下发的每台机组的无功出力目标值,AVC子站系统通过AVR/DCS系统向发电机的励磁系统发送增减磁信号以调节发电机无功出力,最终使各机组无功出力达到目标值。
7.A VC正常时均投远方控制(闭环控制方式),A VC主站系统实时(每5分钟)向电厂侧A VC子站系统下发电厂变高侧母线电压控制目标值,或者A VC主站实时向电厂侧A VC子站系统直接下发各机组的无功出力目标值,根据目标值,使电厂变高侧母线电压或者各机组无功出力向目标值逼进,形成电厂侧A VC子站系统与A VC主站系统的闭环控制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
写的不错~~本人正在学习中~~有兴趣的顶下~`我将继续补发后面的~~~第一篇:函数的运行第一篇:函数的运行在一般的单片机系统中,是以前后台的方式(大循环+中断)来处理数据和作出反应的。
例子如下:makefile的设定:运行WinAvr中的Mfile,设定如下MCU Type: mega8Optimization level: sDebug format :AVR-COFFC/C++ source file: 选译要编译的C文件#include <avr/io.h>void fun1(void){unsigned char i=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}int main(void){fun1();}首先,提出一个问题:如果要调用一个函数,真是只能以上面的方式进行吗?相信学习过C语言的各位会回答,No!我们还有一种方式,就是“用函数指针变量调用函数”,如果大家都和我一样,当初的教科书是谭浩强先生的《C程序设计》的话,请找回书的第9.5节。
例子:用函数指针变量调用函数#include <avr/io.h>void fun1(void){unsigned char i=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}void (*pfun)(); //指向函数的指针int main(void){pfun=fun1; //(*pfun)(); //运行指针所指向的函数}第二种,是“把指向函数的指针变量作函数参数”#include <avr/io.h>void fun1(void){unsigned char i=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}void RunFun(void (*pfun)()) //获得了要传递的函数的地址{(*pfun)(); //在RunFun中,运行指针所指向的函数}int main(void){RunFun(fun1); //将函数的指针作为变量传递}看到上面的两种方式,很多人可能会说,“这的确不错”,但是这样与我们想要的RTOS,有什么关系呢?各位请细心向下看。
以下是GCC对上面的代码的编译的情况:对main()中的RunFun(fun1); 的编译如下ldi r24,lo8(pm(fun1))ldi r25,hi8(pm(fun1))rcall RunFun对void RunFun(void (*pfun)())的编译如下/*void RunFun(void (*pfun)())*//*(*pfun)();*/.LM6:movw r30,r24icallret在调用void RunFun(void (*pfun)())的时候,的确可以把fun1的地址通过r24和r25传递给RunFun()。
但是,RTOS如何才能有效地利用函数的地址呢?-------------第二篇:人工堆栈在单片机的指令集中,一类指令是专门与堆栈和PC指针打道的,它们是rcall 相对调用子程序指令icall 间接调用子程序指令ret 子程序返回指令reti 中断返回指令对于ret和reti,它们都可以将堆栈栈顶的两个字节被弹出来送入程序计数器PC中,一般用来从子程序或中断中退出。
其中reti还可以在退出中断时,重开全局中断使能。
有了这个基础,就可以建立我们的人工堆栈了。
例:#include <avr/io.h>void fun1(void){unsigned char i=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}unsigned char Stack[100]; //建立一个100字节的人工堆栈void RunFunInNewStack(void (*pfun)(),unsigned char *pStack){*pStack--=(unsigned int)pfun>>8; //将函数的地址高位压入堆栈,*pStack--=(unsigned int)pfun; //将函数的地址低位压入堆栈,SP=pStack; //将堆栈指针指向人工堆栈的栈顶__asm__ __volatile__("RET \n\t"); //返回并开中断,开始运行fun1 ()}int main(void){RunFunInNewStack(fun1,&Stack[99]);}RunFunInNewStack(),将指向函数的指针的值保存到一个unsigned cha r的数组Stack中,作为人工堆栈。
并且将栈顶的数值传递组堆栈指针SP,因此当用" ret"返回时,从SP中恢复到PC中的值,就变为了指向fun1()的地址,开始运行fun 1().上面例子中在RunFunInNewStack()的最后一句嵌入了汇编代码"ret",实际上是可以去除的。
因为在RunFunInNewStack()返回时,编译器已经会加上"ret"。
我特意写出来,是为了让大家看到用"ret"作为返回后运行fun1()的过程。
第三篇:GCC中对寄存器的分配与使用在很多用于AVR的RTOS中,都会有任务调度时,插入以下的语句:入栈:__asm__ __volatile__("PUSH R0 \n\t");__asm__ __volatile__("PUSH R1 \n\t");......__asm__ __volatile__("PUSH R31 \n\t");出栈__asm__ __volatile__("POP R31 \n\t");......__asm__ __volatile__("POP R1 \n\t");__asm__ __volatile__("POP R0 \n\t");通常大家都会认为,在任务调度开始时,当然要将所有的通用寄存器都保存,并且还应该保存程序状态寄存器SREG。
然后再根据相反的次序,将新任务的寄存器的内容恢复。
但是,事实真的是这样吗?如果大家看过陈明计先生写的small rots51,就会发现,它所保存的通用寄存器不过是4组通用寄存器中的1组。
在Win AVR中的帮助文件avr-libc Manual中的Related Pages中的F requently Asked Questions,其实有一个问题是"What registers are used b y the C compiler?" 回答了编译器所需要占用的寄存器。
一般情况下,编译器会先用到以下寄存器1 Call-used registers (r18-r27, r30-r31): 调用函数时作为参数传递,也就是用得最多的寄存器。
2 Call-saved registers (r2-r17, r28-r29): 调用函数时作为结果传递,当中的r28和r29可能会被作为指向堆栈上的变量的指针。
3 Fixed registers (r0, r1): 固定作用。
r0用于存放临时数据,r1用于存放0。
还有另一个问题是"How to permanently bind a variable to a r egister?",是将变量绑定到通用寄存器的方法。
而且我发现,如果将某个寄存器定义为变量,编译器就会不将该寄存器分配作其它用途。
这对RTOS是很重要的。
在"Inline Asm"中的"C Names Used in Assembler Code"明确表示,如果将太多的通用寄存器定义为变量,刚在编译的过程中,被定义的变量依然可能被编译器占用。
大家可以比较以下两个例子,看看编译器产生的代码:(在*.lst文件中)第一个例子:没有定义通用寄存器为变量#include <avr/io.h>unsigned char add(unsigned char b,unsigned char c,unsigned char d){return b+c*d;}int main(void){unsigned char a=0;while(1){a++;PORTB=add(a,a,a);}}在本例中,"add(a,a,a);"被编译如下:mov r20,r28mov r22,r28mov r24,r28rcall add第二个例子:定义通用寄存器为变量#include <avr/io.h>unsigned char add(unsigned char b,unsigned char c,unsigned cha r d){return b+c*d;}register unsigned char a asm("r20"); //将r20定义为变量aint main(void){while(1){a++;PORTB=add(a,a,a);}}在本例中,"add(a,a,a);"被编译如下:mov r22,r20mov r24,r20rcall add当然,在上面两个例子中,有部份代码被编译器优化了。
通过反复测试,发现编译器一般使用如下寄存器:第1类寄存器,第2类寄存器的r28,r29,第3类寄存器如在中断函数中有调用基它函数,刚会在进入中断后,固定地将第1类寄存器和第3类寄存器入栈,在退出中断又将它们出栈。
-------------未完待续-----------------------------------__________________________<armok01146983.gif>2007-09-20,01:31:27 资料邮件编辑删除【9楼】cool_haw k积分:53派别:等级:------来自:武汉第四篇:只有延时服务的协作式的内核Cooperative Multitasking前后台系统,协作式内核系统,与占先式内核系统,有什么不同呢?记得在21IC上看过这样的比喻,“你(小工)在用厕所,经理在外面排第一,老板在外面排第二。
如果是前后台,不管是谁,都必须按排队的次序使用厕所;如果是协作式,那么可以等你用完厕所,老板就要比经理先进入;如果是占先式,只要有更高级的人在外面等,那么厕所里无论是谁,都要第一时间让出来,让最高级别的人先用。