导言
在作为国家863方案子项目发掘机智能化操控体系的开发中,呈现了智能化发掘机轨道操控体系不依照预先设定好的轨道运转和嵌入式实时多使命操作体系μC/OS-Ⅱ调度紊乱等失控问题。该智能化体系中选用了μC/OS-Ⅱ,经过位移传感器实时收集发掘机的铲斗、斗杆和动臂等3路视点信号,经过算法规划途径驱动液压比例阀完成平行推动、铲斗发掘等典型作业。本文首要针对课题遇到的问题,要点论述μC/OS-Ⅱ在芯片内Flash存储器运转时要害问题的剖析与处理办法。
1μC/OS-Ⅱ在Flash存储器中的运转
1.1 μC/OS-Ⅱ的特色与功用
μC/OS-Ⅱ是一个实时多使命的嵌入式操作体系,它选用可掠夺型内核。一切的使命都有优先级,多使命之间优先级高的能够中止履行中的低优先级使命而优先履行。
它的特色首要有:揭露源代码、可移植性、可固化、可削减、支撑多使命、具有可确认性等。μC/OS-Ⅱ是根据优先级抢占式的实时多使命操作体系,包含了实时内核、使命办理、时间办理、使命间通讯同步(信号量、邮箱、音讯行列)和内存办理等功用。
1.2要害问题
在完成了智能操控软件后,便是将之嵌入到μC/OS-Ⅱ体系中。遇到的首要问题是移植好的μC/OS-Ⅱ源代码在闻亭的方针板上在线仿真时,把.out文件下载到RAM中能正常履行,可是用CCS烧写到Flash存储器中就不能正常履行,呈现智能化发掘机轨道操控体系不依照预先设定好的轨道运转和μC/OS-Ⅱ实时多使命调度紊乱等失控问题,尤其是在课题的后期检验阶段问题尤为扎手。
1.3原因剖析
程序固化的要害问题是如安在程序存储器中分配存储空间给常量和用const要害字界说的静态、全局变量。经过细心研讨,发现与TI的C编译器功用有关。CCS的编译器依照规范C,没有对Flash ROM中常数数据进行直接拜访的功用。所以有必要让const段的常量数据在RAM中。
完成这一条件的办法有3种:
a)办法1:处理μC/OS-Ⅱ在Flash中运转的办法,选用去除const要害字,在程序中赋初值运用,而且需求在.cmd文件中将.cinit段分配到程序区Flash存储空间,然后在编译器的编译选项中选中“-C”,即ROM初始化(C编译器默许便是这样的)。
b)办法2:不对界说作修正,.const段保存在Flash存储器中,数据不向数据存储器移动,程序运转时直接在程序存储空间中拜访这些量。因为c言语缺少拜访程序区数据的有用手法,因而这些句子只能运用汇编言语编写。因为在每一处拜访这些常量时都有必要运用这些句子,因而这样编写程序改动量较大。
c)办法3:不需求修正常量界说,也不用编写专门的程序,首要的作业是修正.cmd文件并对工程中运用的库文件作简略的修正,修正作业量小而且会集,极大当地便了程序的编写。较之前两种办法,这种办法运用起来要便利得多。
2要害问题的处理与完成
以下别离介绍办法1和办法3的详细完成。
2.1办法1
处理μC/OS-Ⅱ在Flash存储器中运转的办法,即去除const要害字,在程序中赋初值运用,以μC/OS-Ⅱ的更改为例:
2.1.1问题的发现
μC/OS-Ⅱ的程序烧写到Flash中的问题,刚开端置疑是分配存储器的cmd文件有问题,然后相关的又想到程序的巨细问题,特别是在咨询闻亭的技术人员奉告大于1 kB的程序要分隔烧后,乃至置疑闻亭的仿真器和开发板。后来试验运用合众达的板子是相同的作用,而且发现不带μC/OS的巨细程序都能正常履行,根本排除了程序巨细的问题以及硬件问题。后来经过对μC/OS体系使命调度前加LED函数,发现:直到多使命调度前都能正常履行,开端多使命调度后就出了问题。到这儿确认问题出在μC/OS-Ⅱ上,可是μC/OS-Ⅱ的移植是其他人员做的,其他自身没有做过严厉测验,也没有烧到Flash存储器中运转过,对整个课题发生丧命的影响。最终课题组剖析了程序在Flash存储器中运转与在RAM中运转的本质区别,提出一个重要的主张:可能有体系需求的常量界说在扩展RAM区了,当掉电后,RAM区的内容没有了,常量也就没有了,影响了体系的运转。
经过检查工程的cmd文件和编译输出的map文件,发现的确有体系内核的常量放在8000h今后的扩展RAM区。见下面map文件引证:
然后在OS_CORE.C中找到了常量的方位,别离是掩码表:INT8U const OSMapTbl[]和使命优先级断定表:INT8U const OSUnMapTbl[]
经过试验发现,烧写程序到Flash存储器中之后,假如不关电源,而直接拔掉USB,从Flash存储器引导,复位后程序能正常履行,可是关电后就不能了。经检查,Flash存储器烧写进程是先将程序装载到RAM,再搬移到Flash存储器中,所以不掉电一切程序都在RAM中有保存,可是程序确能从Flash存储器引导。这样,就确认了的确是这些常量放在RAM中引起的。可是并不像开端幻想的那样,把常量直接界说在Flash存储器区就能处理,但能够经进程序赋值来初始化这些常量,而不经过编译来初始化,这是一个不一定最好但很有用的办法。
2.1.2修正办法
依照上面的思路,对μC/OS作了如下3处修正:
a)OS_CORE.C文件中上面两个数组的上面的初始化界说改为下面两个初始化函数:
b)对μC/OS-Ⅱ.H函数进行修正:将外部变量弓用的界说
c)在主程序的main()函数中的多使命调度函数履行前调用前面的两个初始化函数,如下:
此办法用一句话总结,便是将常量界说成变量,以赋值句子的方法初始化到RAM中。