一种单片机系统 MAP 数据标定方法 【技术领域】
本发明涉及一种 MAP 数据标定方法, 特别是关于一种用于小容量 RAM 单片机系统 中的 MAP 数据标定方法。背景技术
在汽车电子领域, 嵌入式系统大都使用单片机作为控制核心。由于控制系统的复 杂性和对象的多样性, 单片机系统中有大量的参数无法在系统设计时确定, 需要在系统开 发完成后通过匹配标定来确定。而这种匹配标定, 往往是利用 PC 机上的标定工具软件, 通 过基于总线的协议与单片机系统建立连接, 将标定工具软件上的操作, 传送给单片机, 由单 片机完成相应的操作。在单片机内的 FLASH 上, 保存有这些需要标定的参数即 MAP 的初始 值; 通过基于总线的协议接收标定工具软件的操作, 对 MAP 进行数据更新 ; 由于 FLASH 中的 数值只能通过 FLASH 编程软件才能更新, 而在运行 FLASH 编程软件的时候, 一般不能同时执 行读取 FLASH 的程序, 需要停止正常程序的运行, 进入专门的 FLASH 编程模块, 因此这种方 式无法支持 MAP 的在线标定 ; 针对这个问题, 目前常用的解决方案是把 MAP 数据从单片机 内的 FLASH 中拷贝到单片机内的 RAM 中, 在线标定的时候, 修改的是 RAM 中的 MAP 数据, 通 过数据查询函数, 检测到 MAP 数据修改后的结果。但是, 这种方法也有缺陷 : 由于单片机片 内的 RAM 容量往往很小, 而一些嵌入式系统中需要标定的 MAP 很多, 例如发动机的控制系 统 ESP、 变速箱的控制系统 ABS 和汽车动力学控制系统 TCS 等, 往往无法把所有的 MAP 数据 从单片机内的 FLASH 中全部拷贝到单片机内的 RAM 中。目前, 对此常用的解决方法有两种 : 一是在单片机的外部扩展 RAM 用于标定, 这需要在单片机管脚上把地址总线和数据总线引 出, 占用了大量的管脚资源, 而且会使系统的电磁兼容性恶化, 增加系统成本 ; 二是通过分 块标定, 把所有的标定 MAP 分块, 一次标定只把一块区域的 MAP 数据拷贝到单片机内的 RAM 中, 因此一次只能标定一块区域内的 MAP 数据, 这种方法局限性很大, 事先无法确定一次标 定需要修改多少 MAP, 在 MAP 分区的时候也就无法选择一种适应整个标定阶段的划分方法, 并且需要在多个标定页之间来回切换, 而对于这种在线切换, 会将先前进行的标定工作丢 失。 发明内容
针对上述问题, 本发明的目的是提供一种能够较好地支持单片机系统, 特别是小 容量 RAM 单片机系统在线标定的单片机系统 MAP 数据标定方法。
为实现上述目的, 本发明采取以下技术方案 : 一种单片机系统 MAP 数据标定方法, 其特征在于 : 它包括以下步骤 :
1) 在单片机内存中设置若干个区域, 包括以下步骤 :
①根据 MAP 的数据总量的大小设置一块内存区域, 作为标定 FLASH ;
②根据一次能够标定的 MAP 数据量的大小设置一块内存区域, 作为标定 RAM ;
③根据 MAP 的个数设置一块内存区域, 作为信息 FLASH ;④根据 MAP 的数据总量的大小设置一块内存区域, 作为索引 FLASH ;
2) 在由步骤 1) 设置的标定 FLASH 区域内保存所有 MAP 的原始数据 ;
3) 通过已有的工具软件获取每个 MAP 在标定 FLASH 中存放的起始地址和占用空间 大小, 将其保存在由步骤 1) 设置的信息 FLASH 区域内 ;
4) 通过已有的工具软件获取标定 FLASH 区域内每个字节所保存的 MAP 的索引序 号, 将其保存在由步骤 1) 设置的索引 FLASH 区域内 ;
5) 在系统初始化时, 建立并初始化一个 MAP 指针数组, 包括以下步骤 :
①在 MAP 管理模块中, 设置一个指针数组, 该数组元素的下标为 MAP 的索引序号, 数组元素的个数与 MAP 的个数相同, 数组元素为指针, 指向 MAP 在内存中存放空间的起始地 址;
②在系统初始化时, 根据 MAP 个数, 依次从信息 FLASH 中获取每个 MAP 在标定 FLASH 中的起始地址, 然后, 将步骤①中的各个 MAP 指针, 分别指向各个 MAP 在标定 FLASH 中 的起始地址 ;
如果需要对 MAP 数据进行修改, 进入步骤 6) ;
如果需要对 MAP 数据进行查询, 进入步骤 7) ;
6) 在线标定过程中, 把正在标定的 MAP 从单片机内的 FLASH 拷贝到单片机内的 RAM 内, 在 RAM 中对相应的数据进行修改, 包括以下步骤 :
① PC 机上的标定工具软件与单片机系统建立连接后, 在标定工具软件中对一个 MAP 中的一个数据进行修改, 此时, 标定工具软件计算该数据点相对于该 MAP 起始地址的地 址偏移, 然后根据该 MAP 在标定 FLASH 中的起始地址, 进一步确定该数据点在标定 FLASH 中 存放的地址, 标定工具软件把该地址和修改后的数据发送给单片机 ;
②单片机根据由步骤①标定工具软件发送来的地址, 查询索引 FLASH 内对应地址 中所保存的 MAP 索引序号, 然后根据这个索引序号, 访问信息 FLASH 内结构体数组中下标为 此索引序号的元素, 继而得到该 MAP 在标定 FLASH 内的起始地址和占用空间大小 ;
③单片机根据步骤②获得的 MAP 索引序号, 查询相应的 MAP 指针, 得到该 MAP 指针 当前指向的地址 :
如果该地址位于标定 FLASH 内, 进入步骤④ ;
如果该地址位于标定 RAM 内, 进入步骤⑤ ;
④根据步骤②获得的起始地址和占用空间大小, 单片机将位于标定 FLASH 中以该 起始地址开始的, 相应空间大小内的数据全部拷贝到标定 RAM 的空白区域中 ; 记录当前标 定 RAM 区域中使用的空间大小 ; 然后修改该 MAP 的指针, 使其指向标定 RAM 区域内该 MAP 存 放空间的起始地址, 进入步骤⑤ ;
⑤已知需要修改的数据点在标定 FLASH 中的存放地址, 单片机根据该数据点所在 MAP 在标定 FLASH 内的起始地址和在标定 RAM 内的起始地址, 得到该数据点在标定 RAM 中的 存放地址, 将该地址内的数据修改为更新后的数据 ;
7) 已知 MAP 在 FLASH 中的起始地址和占用空间大小, 通过查询相应的 MAP 指针, 得 到该 MAP 当前存放空间的起始地址, 从而对以该起始地址开始的, 相应空间大小的内存区 域中的数据, 进行查表插值操作, 包括以下步骤 :
①单片机把 MAP 在标定 FLASH 中的起始地址作为参数传递给查表插值函数 ;②查表插值函数根据由步骤①获得的起始地址, 查询索引 FLASH 内对应地址中所 保存的 MAP 索引序号 ;
③单片机根据由步骤②获得的 MAP 索引序号, 查询相应的 MAP 指针, 得到该 MAP 当 前存放空间的起始地址 ;
④基于由步骤③获得的起始地址, 对相应空间大小的内存区域中的数据, 进行查 表插值操作, 结束。
上述步骤 3) 中, 通过已有的 MAP 存储分析软件获取每个 MAP 在标定 FLASH 中存放 的起始地址和占用空间大小。
上述步骤 4) 中, 通过已有的 MAP 存储分析软件获取标定 FLASH 区域内每个字节所 保存的 MAP 的索引序号。
上述步骤 4) 中, 在索引 FLASH 内, 每个字节存放一个索引序号。
上述步骤 4) 中, 当 MAP 个数大于 255 时, 在索引 FLASH 内, 每两个字节存放一个索 引序号。
上述步骤 3) 中, 采用结构体数组保存每个 MAP 的起始地址和占用空间大小 ; 该数 组元素的下标为 MAP 的索引序号, 数组元素的个数与 MAP 的个数相同, 数组元素为结构体, 包括两个成员 : MAP 占用空间大小和 MAP 在标定 FLASH 内的起始地址。 本发明由于采取以上技术方案, 其具有以下优点 : 1、 由于本发明只把需要标定的 MAP 数据在线实时地拷贝到 RAM 中, 从而占用的 RAM 空间较小, 解决了小容量 RAM 单片机系 统标定大量数据的问题。2、 由于本发明能够在线标定所有需要标定的 MAP 数据, 解决了现 有的因分块标定或 RAM 空间不够不能一次标定所有 MAP 的问题。采用本发明可以降低单片 机系统的复杂程度和制造成本。
附图说明
图 1 是本发明单片机内存区域划分示意图 ; 图 2 为本发明初始化时的 MAP 指针示意图 ; 图 3 为本发明在线标定时的 MAP 指针示意图。具体实施方式
如图 1 所示, 本发明方法包括以下步骤 :
1) 在单片机内存中设置若干个区域 ;
2) 在单片机内存中保存所有 MAP 的原始数据 ;
3) 在单片机内存中保存每个 MAP 的起始地址和占用空间大小 ;
4) 在单片机内存中保存每个 MAP 的索引序号 ;
5) 在系统初始化时, 建立并初始化一个 MAP 指针数组 ;
6) 在线标定过程中, 把正在标定的 MAP 从单片机内的 FLASH 拷贝到单片机内的 RAM 内, 在 RAM 中对相应的数据进行修改 ;
7) 已知 MAP 在 FLASH 中的起始地址和占用空间大小, 通过查询相应的 MAP 指针, 得 到该 MAP 当前存放空间的起始地址, 从而对以该起始地址开始的, 相应空间大小的内存区 域中的数据, 进行查表插值操作。下面结合附图和实施例对本发明进行详细的描述。
1) 在单片机内存中设置若干个区域, 包括以下步骤 :
①根据 MAP 的数据总量的大小设置一块内存区域, 作为标定 FLASH, 用于保存所有 的 MAP 数据。
在本发明实施例中, 如图 1 所示, 将单片机内存中地址 0x140000 开始的 128K 空间 设置为标定 FLASH。
②根据一次能够标定的 MAP 数据量的大小设置一块内存区域, 作为标定 RAM, 用于 保存在线标定过程中更新过的 MAP 最新数据。
在本发明实施例中, 如图 1 所示, 将单片机内存中地址 0x400000 开始的 64K 空间 设置为标定 RAM。
③根据 MAP 的个数设置一块内存区域, 作为信息 FLASH, 用于保存每个 MAP 在标定 FLASH 中的起始地址和该 MAP 的占用空间大小。
在本发明实施例中, 如图 1 所示, 将单片机内存地址 0x100000 开始的 8K 空间设置 为信息 FLASH。
④根据 MAP 的数据总量的大小设置一块内存区域, 作为索引 FLASH, 用于保存标定 FLASH 对应地址所存放的 MAP 的索引序号。 在本发明实施例中, 如图 1 所示, 将单片机内存中地址 0x160000 开始的 128K 空间 设置为索引 FLASH。
2) 在单片机内存中保存所有 MAP 的原始数据, 具体为 :
在由步骤 1) 设置的标定 FLASH 区域内保存所有 MAP 的原始数据。
3) 在单片机内存中保存每个 MAP 的起始地址和占用空间大小, 包括以下步骤 :
①通过已有的工具软件, 如 MAP 存储分析软件, 获取每个 MAP 在标定 FLASH 中存放 的起始地址和占用空间大小 ;
②将每个 MAP 在标定 FLASH 中的起始地址和占用空间大小保存在由步骤 1) 设置 的信息 FLASH 区域内。
其中, 可以采用结构体数组记录每个 MAP 的起始地址和占用空间大小 ; 该数组元 素的下标为 MAP 的索引序号, 数组元素的个数与 MAP 的个数相同, 数组元素为结构体, 包括 两个成员 : MAP 占用空间大小和 MAP 在标定 FLASH 内的起始地址。
上述结构体中, 可以采用一个 16 位变量记录 MAP 占用空间大小, 采用一个 32 位变 量记录 MAP 在标定 FLASH 内的起始地址。
假 设 在 本 发 明 实 施 例 中, 标 定 FLASH 内 有 6 张 MAP, 第 一 张 MAP(MAP0) 保 存 在 0x140000 ~ 0x1400FF 的范围内, 第二张 MAP(MAP1) 保存在 0x140100 ~ 0x1401FF 的范围 内, 第三张 MAP(MAP2) 保存在 0x140200 ~ 0x1402FF 的范围内, 第四张 MAP(MAP3) 保存在 0x140300 ~ 0x1403FF 的范围内, 第五张 MAP(MAP4) 保存在 0x140400 ~ 0x1404FF 的范围内, 第六张 MAP(MAP5) 保存在 0x140500 ~ 0x1405FF 的范围内, 这 6 张 MAP 对应的 MAP 序号分 别为 0、 1、 2、 3、 4 和 5, 于是 : 信息 FLASH 中的结构体数组相应地包括六个数组元素, 数组元 素 0 为 {0x100, 0x140000}( 表示 MAP0 的大小为 0x100, 起始地址为 0x140000), 数组元素 1 为 {0x100, 0x140100}, 数组元素 2 为 {0x100, 0x140200}, 数组元素 3 为 {0x100, 0x140300}, 数组元素 4 为 {0x100, 0x140400}, 数组元素 5 为 {0x100, 0x140500}。
4) 在单片机内存中保存每个 MAP 的索引序号, 包括以下步骤 :
①通过已有的工具软件, 如 MAP 存储分析软件, 获取标定 FLASH 区域内每个字节所 保存的 MAP 的索引序号 ( 从 0 开始 ) ;
②在由步骤 1) 设置的索引 FLASH 区域内, 以字节为单位存放标定 FLASH 对应地址 所存放的 MAP 的索引序号。
其中, 如果 MAP 个数大于 255, 在索引 FLASH 内, 可以每两个字节存放一个索引序 号。
在 本 发 明 实 施 例 中, 0x160000 ~ 0x1600FF 内 保 存 的 都 是 0, 0x1600100 ~ 0x1601FF 内保存的都是 1, 0x1600200 ~ 0x1602FF 内保存的都是 2, 0x1600300 ~ 0x1603FF 内保存的都是 3, 0x1600400 ~ 0x1604FF 内保存的都是 4, 0x1600500 ~ 0x1605FF 内保存的 都是 5。
5) 在系统初始化时, 建立并初始化一个 MAP 指针数组, 包括以下步骤 :
①在 MAP 管理模块中, 设置一个指针数组, 该数组元素的下标为 MAP 的索引序号, 数组元素的个数与 MAP 的个数相同, 数组元素为指针, 指向 MAP 在内存中存放空间的起始地 址, 用于表示 MAP 保存在以该起始地址开始的内存区域内 ; ②在系统初始化时, 根据 MAP 个数, 依次从信息 FLASH 中获取每个 MAP 在标定 FLASH 中的起始地址, 然后, 将步骤①中的各个 MAP 指针, 分别指向各个 MAP 在标定 FLASH 中 的起始地址 ;
如果需要对 MAP 数据进行修改, 进入步骤 6) ;
如果需要对 MAP 数据进行查询, 进入步骤 7)。
在本发明实施例中, 如图 2 所示, 系统初始化后, MAP 指针指向的地址依次为 : MAP0 指针指向 0x140000, MAP1 指针指向 0x140100, MAP2 指针指向 0x140200, MAP3 指针指向 0x140300, MAP4 指针指向 0x140400, MAP5 指针指向 0x140500。
6) 在线标定过程中, 把正在标定的 MAP 从单片机内的 FLASH 拷贝到单片机内的 RAM 内, 在 RAM 中对相应的数据进行修改, 包括以下步骤 :
① PC 机上的标定工具软件与单片机系统建立连接后, 在标定工具软件中对一 MAP 中的一个数据进行修改, 此时, 标定工具软件计算该数据点相对于所在 MAP 起始地址的地 址偏移, 然后根据该 MAP 在标定 FLASH 中的起始地址, 进一步确定该数据点在标定 FLASH 中 的存放地址, 标定工具软件把该地址和修改后的数据发送给单片机 ;
在本发明实施例中, 假设对 MAP2 中的一个数据点进行修改, 标定工具软件计算该 点相对于 MAP 起始地址的地址偏移为 0x10, 因为 MAP2 保存在标定 FLASH 中以地址 0x140200 开始的内存区域, 且修改后的数据为 0x66, 那么标定工具软件把 0x140210 和 0x66 发送给单 片机 ;
②单片机根据由步骤①标定工具软件发送来的地址, 查询索引 FLASH 内对应地址 中所保存的 MAP 索引序号, 然后根据这个索引序号, 访问信息 FLASH 内结构体数组中下标为 此索引序号的元素, 继而得到该 MAP 在标定 FLASH 内的起始地址和占用空间大小 ;
在本发明实施例中, 单片机根据接收到的地址 0x140210, 查询索引 FLASH 地址 0x160210 中所保存的 MAP 索引序号, 该索引序号为 2, 根据该索引序号, 访问信息 FLASH 内 结构体数组中下标为 2 的元素, 继而得到 MAP2 在标定 FLASH 内的起始地址 0x140200, 占用
空间大小 0x100 ;
③单片机根据步骤②获得的 MAP 索引序号, 查询相应的 MAP 指针, 得到该 MAP 指针 当前指向的地址 :
如果该地址位于标定 FLASH 内, 进入步骤④ ;
如果该地址位于标定 RAM 内, 进入步骤⑤ ;
④根据步骤②获得的起始地址和占用空间大小, 单片机将位于标定 FLASH 中以该 起始地址开始的, 相应空间大小内的数据全部拷贝到标定 RAM 的空白区域中 ; 用一个整型 32 位的变量, 记录当前标定 RAM 区域中使用的空间大小 ; 然后修改该 MAP 的指针, 使其指向 标定 RAM 区域内该 MAP 存放空间的起始地址, 进入步骤⑤ ;
⑤已知需要修改的数据点在标定 FLASH 中的存放地址, 单片机根据该数据点所在 MAP 在标定 FLASH 内的起始地址和在标定 RAM 内的起始地址, 得到该数据点在标定 RAM 中的 存放地址, 将该地址内的数据修改为更新后的数据。
在本发明实施例中, 当前 MAP2 的指针指向地址 0x140200, 位于标定 FLASH 内, 单片 机把标定 FLASH 中地址 0x140200 ~ 0x1402FF 内共 0x100 字节的数据全部拷贝到标定 RAM 中地址 0x400000 ~ 0x4001FF 的区域内 ; 设置一个整型 32 位的变量, 其值为 0x100, 表明标 定 RAM 区域中已经使用了 0x100 字节的空间 ; 然后修改 MAP2 指针, 使其指向 0x400000( 如 图 3 所示 ) ; 已知需要修改的数据点在标定 FLASH 中的存放地址为 0x140210, 单片机根据该 点所在 MAP 在标定 FLASH 内的起始地址 0x140200 和在标定 RAM 内的起始地址 0x400000, 得到需要修改的数据点在标定 RAM 中的存放地址 0x400010, 然后把地址 0x400010 内储存 的数据修改为 0x66。如果在完成上述标定后, 在标定工具软件中又修改了 MAP2 中另一数 据点, 假设这次需要修改的数据点在标定 FLASH 中的存放地址为 0x140220, 修改后的数据 为 0x55, 那么标定工具软件把 0x140220 和 0x55 发送给单片机 ; 单片机根据接收到的地址 0x140220, 查询索引 FLASH 中地址 0x160220 内储存的 MAP 索引序号, 该索引序号为 2, 根据 该索引序号, 访问信息 FLASH 内结构体数组中下标为 2 的元素, 继而得到 MAP2 在标定 FLASH 内的起始地址 0x140200, 占用空间大小 0x100 ; 查询 MAP2 指针, 由于该指针已经指向了地址 0x400000, 位于标定 RAM 内, 表明之前已经把该 MAP 所有的数据从标定 FLASH 中拷贝到了标 定 RAM 中, 所以这次不再需要拷贝原始数据 ; 已知需要修改的数据点在标定 FLASH 内的存放 地址为 0x140220, 单片机根据该点所在 MAP 在标定 FLASH 内的起始地址 0x140200 和在标定 RAM 内的起始地址 0x400000, 得到需要修改的数据点在标定 RAM 内的存放地址 0x400020, 然 后把地址 0x400020 内储存的数据修改为 0x55。
7) 已知 MAP 在 FLASH 中的起始地址和占用空间大小, 通过查询相应的 MAP 指针, 得 到该 MAP 当前存放空间的起始地址, 从而对以该起始地址开始的, 相应空间大小的内存区 域中的数据, 进行查表插值操作, 包括以下步骤 :
①单片机把 MAP 在标定 FLASH 中的起始地址作为参数传递给查表插值函数 ;
②查表插值函数根据由步骤①获得的起始地址, 查询索引 FLASH 内对应地址中所 保存的 MAP 索引序号 ;
③单片机根据由步骤②获得的 MAP 索引序号, 查询相应的 MAP 指针, 得到该 MAP 当 前存放空间的起始地址 ;
④基于由步骤③获得的起始地址, 对相应空间大小的内存区域中的数据, 进行查表插值操作, 结束。
在本发明实施例中, 如果是对 MAP2 进行查表插值操作, 已知 MAP2 在 FLASH 中的 起始地址 0x140200 和占用空间大小 0x100, 单片机把 MAP2 在标定 FLASH 中的起始地址 0x140200 作为参数传递给查表插值函数, 查表插值函数根据该起始地址, 在索引 FLASH 中 查询地址 0x160200 中所保存的 MAP 索引序号, 得到该序号为 2, 由此得知需要进行操作的 是 MAP2, 查询 MAP2 指针, 得到该 MAP 当前位于以地址 0x400000 开始的内存区域内, 对以地 址 0x400000 开始的, 大小为 0x100 的内存区域中的 MAP 数据, 进行查表插值操作。如果是 对 MAP1 进行查表插值操作, 则已知 MAP1 在 FLASH 中的起始地址 0x140100 和占用空间大小 0x100, 单片机把 MAP1 在标定 FLASH 中的起始地址 0x140100 作为参数传递给查表插值函 数, 查表插值函数根据该起始地址, 在索引 FLASH 中查询 0x140100 中所保存的 MAP 索引序 号, 得到该索引序号为 1, 由此得知需要进行操作的是 MAP1, 查询 MAP1 指针, 得到该 MAP 当 前位于以地址 0x140100 开始的内存区域内, 对以地址 0x140100, 大小为 0x100 的内存区域 中的 MAP 数据, 进行查表插值操作。
上述实施例仅用于说明本发明, 其中各个步骤的具体实施方式等都是可以有所变 化的, 凡是在本发明技术方案的基础上进行的等同变换和改进, 均不应排除在本发明的保 护范围之外。