201109

来源:互联网 发布:剑三正太捏脸数据导入 编辑:程序博客网 时间:2024/06/05 03:53

1     题目概述:设计硬件重要表项核查和自愈机制

1.1     试题考核目的和使用说明

考核目的:在底层软件驱动开发中,经常需要使用硬件的重要表项(如以太网层二转发表项、硬件重要寄存器配置等)和重要配置,为了硬件表项和配置的可靠性应用,需要设计硬件重要表项的核查和自愈机制,本题目希望考生能设计通用的硬件重要表项核查和自愈机制(注:此处的自愈是指不复位单板,且对业务影响最小的自愈),主要的目的是使考生理解对于有硬件表项或者关键寄存器的芯片如何进行可靠驱动,以便在以后的底层软件开发工作中应用这些思想甚至直接借鉴移植相关的代码。

1.2 试题使用与答卷提交

使用说明试题中已经明确说明了每个特性的验收标准(试题工程中提供了基本的自动化测试代码,与考生代码直接编译链接后即可自动运行测试),考生需要根据验收标准自行考虑完备的测试思路,考虑各种出错的可能情况。

调试环境:本试题采用Visual Studio 2005集成调测环境,并提供了已经建好的工程,具体使用方法参见“1.5试题提供的可直接使用的VC工程”。

答卷提交:请使用试题包中的ChkHwTbl.cpp和ChkHwTbl.h编写调试源代码(所有新增源代码均应在这两个文件中,不能增加或者删减源文件),完成后把ChkHwTbl.cpp和ChkHwTbl.h两个文件用WinRar打包成一个文件后提交,命名格式为“考试级别数字+姓名拼音的首字母+8位工号”的格式,如:

张三的工号为00187658,考0级,则打包文件的名称为:0z00187658.rar

王五的工号为00176588,考1级,则打包文件的名称为:1w00176588.rar

1.3     试题说明

试题简介:在底层软件驱动开发中,经常遇见需要设计硬件重要表项的核查和自愈机制,例如以下应用场景需要进行硬件表项的核查和自愈设计:

【场景1】:以太网交换芯片的层2交换功能实际上是在芯片内部维护一个交换网表,包括单播表项和多播表项,单播表和多播表记录了以太网端口交换(单播)和多播的关系,这个芯片内部的单播表和多播表就是硬件芯片中的重要表项,该表项如果不慎被破坏(软件踩踏或者硬件失效),则会造成以太网交换关系紊乱,造成用户断线或者信令断开。因此在这种场景下需要对芯片内部的硬件表项进行核查,当出现故障时要及时自愈;

【场景2】:单板上硬件芯片内部会有一些关键的配置寄存器,这些配置寄存器决定了该芯片的工作模式,如果这些关键的配置寄存器不慎被破坏(软件踩踏或者硬件失效),则会造成不可预估的后果,因此在这种场景下需要对硬件芯片的关键寄存器进行核查,当出现与设计不一致时以最快的速度进行自愈处理。

试题要求:本题请考生自行设计通用的硬件重要表项的核查和自愈机制,要求可以动态添加需要核查自愈的硬件表项或者重要配置空间,并可以按照应用的需要设置核查的周期(周期越短,核查频率越高)要求考生实现的具体功能包括

(1)   提供需要核查的硬件表项注册函数:该函数支持动态注册需要核查的硬件表项到“硬件重要表项的核查和自愈机制”中,一旦该表项注册成功,则“硬件重要表项的核查和自愈机制”会自动对该表项进行核查,一旦发现表项核查失败,则进行相应的自愈操作(方案参考:维护一个“软表”来记录硬件表项的内容,对软表内容要进行校验,不要求用复杂的校验算法,用累加和校验或者异或校验均可,当软表校验正确但是与硬件表项不一致时,即表示硬件表项故障,此时通过软表来恢复硬件表项进行自愈)。不要求支持已经注册的核查表删除功能。具体的函数原型定义如下:

/********************************************************************

函数原型:UINT32 CHK_RegHwTable(UINT32 ulHwTblStartAddr, UINT32 ulHwTblLen,

CHK_TASK_CYCLE_ENUM enChkCycle,

UINT32* pulSftTblStartAddr,UINT32* pulSftTblLen)

函数功能:注册硬件表项空间给"硬件重要表项的核查和自愈机制"

输入说明:ulHwTblStartAddr:硬件表项的起始地址

          ulHwTblLen: 硬件表项的长度,以字节为单位

          enChkCycle: 硬件表项核查的周期,核查周期只能是如下几种类型

typedef enum enumCheckCycle /* 核查周期枚举类型 */

{

    CHK_TASK_CYCLE_TYPE0 = 0,  /* CHK_TASK_CYCLE_10MS */

    CHK_TASK_CYCLE_TYPE1,      /* CHK_TASK_CYCLE_50MS */

    CHK_TASK_CYCLE_TYPE2,      /* CHK_TASK_CYCLE_100MS */

    CHK_TASK_CYCLE_TYPE3,      /* CHK_TASK_CYCLE_200MS */

    CHK_TASK_CYCLE_TYPE4,      /* CHK_TASK_CYCLE_500MS */

    CHK_TASK_CYCLE_TYPE5,      /* CHK_TASK_CYCLE_1S */

    CHK_TASK_CYCLE_TYPE6,      /* CHK_TASK_CYCLE_2S */

    CHK_TASK_CYCLE_TYPE7,      /* CHK_TASK_CYCLE_3S */

    CHK_TASK_CYCLE_INVALID     /* 非法类型 */

}CHK_TASK_CYCLE_ENUM;

输出说明:*pulSftTblStartAddr :考生创建的软表基址

*pulSftTblLen:  考生创建的软表长度

这两个输出的主要目的是便于进行故障注入自动化测试,实际工作中可以不要

返回值:0表示注册成功,非零表示注册失败;

*********************************************************************/

UINT32 CHK_RegHwTable(UINT32 ulHwTblStartAddr, UINT32 ulHwTblLen,

CHK_TASK_CYCLE_ENUM enChkCycle,                                                

UINT32* pulSftTblStartAddr, UINT32* pulSftTblLen)

(2)   提供“硬件重要表项的核查和自愈机制”的初始化函数,主要实现该机制所有需要的初始化功能,该函数在试题提供的自动化测试文件ChkHwTblAutoTest.cpp中的main函数中会自动调用,以便进行自动化测试。具体的函数原型定义如下:

/********************************************************************

函数原型:UINT32 CHK_Init(void)

函数功能:"硬件重要表项的核查和自愈机制"初始化函数

输入说明:无

输出说明:无

返回值:0表示初始化成功,非零表示初始化失败;

*********************************************************************/

UINT32 CHK_Init(void)

(3)       备注:如下描述与试题无关,实际工作中参考:在实际工作应用中,使用模块只需要把自己的硬件表项或者关键的配置寄存器空间注册给这个公共机制即可,但是要注意当需要改变硬件表项或者关键配置寄存器时需要同步刷新软件表项和校验值,且在此过程中需要使用与公共机制相同的信号量进行互斥保护。

上述两个接口是试题要求的对外接口,在自动化判阅成绩时会使用,考生可根据如下的验收标准实现自己的内部函数,注意所有新增的正式代码都须放在ChkHwTbl.cppChkHwTbl.h两个文件中试题要求实现的功能和验收标准如下:

Ø  每种核查周期支持最大4个硬件表项核查与自愈,即最多支持32个硬件表项核查与自愈;

Ø  硬件表项出现跳变或者被“踩踏”时应能检测出来并记录日志(试题会提供日志记录的API,日志信息包括出错的地址、原先正确的数据、出错的数据);

Ø  硬件表项出现跳变或者被“踩踏”时应能自愈;

Ø  硬件表项正常时不应该出现误自愈导致的硬件表项被改错;(方案参考:软表校验错误且与硬件表项不一致时说明硬件表项正常,此时用硬件表项“恢复”覆盖软件表项并重新计算校验值)

Ø  不考虑内存跳变和硬件表项同时跳变的“双点故障”场景,即认为这两种情况不可能同时出现;

Ø  需要考虑表项核查时与表项更新操作的互斥(试题提供的互斥API函数为便于自动化测试没有真正的互斥功能,因此考生只要正确使用即可,不需要验证真正的互斥);

Ø   代码的最大圈复杂度不能超过15

1.4     试题配套API文件说明

试题提供的配套API文件为ChkHwTblApi.cppChkHwTblApi.h注:考生直接使用这里的API函数即可,不建议自行修改),该源文件提供了试题编码所需要的所有API函数和桩函数供调用,主要的目的是在脱离操作系统和硬件的情况下可以在PC机上进行试题的编写和调试(在PC机上使用VC环境),该文件中的API函数介绍如下:

(1)   创建并启动一个任务,不支持任务函数参数

/********************************************************************

: UINT32 API_CreateAndStartTask( void *pTaskEntry )

功能描述 : 创建并启动一个任务

输入参数 : pTaskEntry 任务入口,不支持参数

输出参数 :

函数返回 : 0表示成功,非零表示失败

注意事项 : 考生需要针对硬件核查周期创建8个不同的任务

*********************************************************************/

UINT32 API_CreateAndStartTask( void *pTaskEntry )

 

(2)   日志记录函数

/*********************************************************************

: void API_RecordErrorLog (UINT32 ulErrAddr,

UINT8 ucWrongData,

UINT8 ucRightData)

功能描述 : 记录核查出错时的地址、出错数据、本应正确的数据

输入参数 : ulErrAddr: 核查出错的地址,出错一次记录一次,不需要考虑日志覆盖问题

           ucWrongData: 核查出错的字节数据

           ucRightData: 表中原先正确的字节数据

输出参数 :

函数返回 :

注意事项 : 为简单起见,考生无须考虑错误日志覆盖问题,另外出错地址ulErrAddr应该记录

核查发现的第一个出错字节的地址,不一定是4字节对齐的地址

*********************************************************************/

void API_RecordErrorLog (UINT32 ulErrAddr, UINT8 ucWrongData, UINT8 ucRightData)

 

(3)   任务延时函数

/*********************************************************************

: void API_TaskDelay (int iDelayMs)

功能描述 : 主动释放CPU的时间,单位是毫秒

输入参数 : iDelayMs: 需要释放CPU的毫秒数,取值必须大于0

输出参数 :

函数返回 :

*********************************************************************/

void API_TaskDelay (int iDelayMs)

 

(4)   申请指定大小的一段内存

/********************************************************************

: void* API_MemMalloc(unsigned int ulMemSize)

功能描述 : 申请指定大小的一段内存

输入参数 : ulMemSize:申请的内存大小

输出参数 :

函数返回 : 0表示申请失败,非零值表示申请到的内存空间首地址;

*********************************************************************/

void* API_MemMalloc(unsigned int ulMemSize)

 

(5)   释放申请的内存

/********************************************************************

: UINT32 API_MemFree(void* pvMemAddr)

功能描述 : 释放申请的内存

输入参数 : pvMemAddr: 需要释放的内存空间首地址

输出参数 :

函数返回 : 0表示释放成功,非零表示释放失败*********************************************************************/

UINT32 API_MemFree(void* pvMemAddr)

 

(6)   获取信号量(为简单起见,考生无需创建信号量

/********************************************************************

: UINT32 API_semTake(UINT32 ulSemIndex,UINT32 ulWaitTime)

功能描述 : 获取信号量,为方便起见,考生无需创建信号量,直接使用此接口即可

输入参数 : ulSemIndex:信号量序号,0-7,只提供8个信号量,支持上述8种任务,为简单

起见,每种硬件核查周期用相同的信号量即可,另为简单起见

假设应用程序修改硬件表项时也使用此信号量进行互斥保护

           ulWaitTime:信号量等待时间:0xFFFFFFFF表示死等(WAIT_FOREVER

                                          0: 非法

                                    其他值表示等待时间,单位是毫秒

输出参数 :

函数返回 : 0表示获取信号量成功,非零值表示获取信号量失败;

*********************************************************************/

UINT32 API_semTake(UINT32 ulSemIndex,UINT32 ulWaitTime)

 

(7)   释放信号量

/********************************************************************

: UINT32 API_semGive(UINT32 ulSemIndex)

功能描述 : 释放信号量

输入参数 : ulSemIndex:信号量序号,0-7,只提供8个信号量,支持上述8种任务,为简单

起见,每种硬件核查周期用相同的信号量即可

输出参数 :

函数返回 : 0表示释放信号量成功,非零值表示释放信号量失败;*********************************************************************/

UINT32 API_semGive(UINT32 ulSemIndex)

 

1.5     试题提供的可直接使用的VC工程

1.5.1       VC试题工程及其使用方法

双击“\ChkHwTbl\ChkHwTbl.sln”程序可以直接打开工程环境,源代码框架(“ChkHwTbl \source”)已经提前加到工程中了。

其中:

1)考生所有的正式代码务必在ChkHwTbl.cppChkHwTbl.h文件中提供,提交试卷时只需要打包提交这两个文件即可;

2ChkHwTblApi.cppChkHwTblApi.h为提供给考生的可用API函数和相关定义,考生可以参考其内部实现,请勿修改其中的任何内容

3ChkHwTblAutoTest.cppChkHwTblAutoTest.h为自动化测试用例(只提供基本的自动化测试用例,参加考试的同事可根据试题要求设计和使用更详细的测试用例),供考生完成试题后验证实现是否正确,请不要在这两个文件增加正式代码,自动化阅卷时只使用考生提交的ChkHwTbl.cppChkHwTbl.h文件进行阅卷。

1.5.2       VC试题工程调试方法

1、编写好代码后,鼠标右键点击ChkHwTbl,点击Rebuild进行编译

2、编译完成后点击Start DebuggingF5)进行调试,如下图所示:

 

调试运行会出现如下命令窗口显示测试结果:

原创粉丝点击