This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

hercules芯片RM48,ALU检测和MPU使用

Other Parts Discussed in Thread: HALCOGEN

1、需要做ALU检测和响应的寄存器标志位检测,RM48有相应的方法或者机制吗? 

2、用MPU实现栈溢出检测可以吗?如果MPU中出现access violation,芯片会如何响应,ESM模块会收到异常吗还是其他处理方式啊?我用的是RM48的HDK,在手册里没有找到这方面的描述,在别的芯片手册中看到了MPU的描述,RM48的响应方式和其他芯片一样吗?

  • 1 有些不太理解您的问题。 您是指测试ALU的机制,以及是否正确设置/重置了条件代码标志?Hercules MCU没有单独的内置机制来测试此功能。使用Self-Test Controller(STC)的CPU self-test 包括对ALU操作的测试。

    2 可以实现的,这是MPU确定需要多少堆栈的方法。对MPU不允许的区域进行CPU访问(例如,从“ PUSH”进行堆栈写入)将导致中止响应。在这种情况下,没有ESM错误。CPU的中止处理程序必须读取数据故障地址和状态寄存器,以识别中止的原因并做出相应的响应。
  • 1、是我描述不太清晰。举个例子,比如进行加减或者移位操作,然后检查标志位寄存器中溢出标志位或者进位标志位是不是正确。还有一个问题就是,我之前看到一个帖子说标志位寄存器没有映射,需要汇编程序才能操作,是这样吗?

    2、所以如果我用MPU机制去做栈溢出检测,只需要将栈顶和栈底设置成不允许区域,然后再中止处理程序中加检测和响应就可以了,是这个意思吗?

  • 1 当使用CPU的自测控制器(STC)运行逻辑内置自测(LBIST)时,此功能将与其他CPU逻辑一起进行测试。没有其他硬件机制可以测试此逻辑。如果需要,应用程序可以包括软件测试以验证此功能。

    2 由HALCoGen生成的初始化例程使您可以为所有CPU模式设置堆栈的顶部。这些堆栈向下生长。例如,coreInitStackPointer()例程使用以下默认值(来自sys_core.asm):

    userSp .word 0x08000000 + 0x00001000
    svcSp .word 0x08000000 + 0x00001000 + 0x00000100
    fiqSp .word 0x08000000 + 0x00001000 + 0x00000100 + 0x00000100
    irqSp .word 0x08000000 + 0x00001000 + 0x00000100 + 0x00000100 + 0x00000100
    abortSp .word 0x08000000 + 0x100x0x100x0x100x0100
    undefSp .word 0x08000000 + 0x00001000 + 0x00000100 + 0x00000100 + 0x00000100 + 0x00000100 + 0x00000100

    user (and System) 模式的堆栈从0x08001000开始,并从那里递减至0x08000000。如果堆栈“增长”超过该地址(低于0x08000000),它将自动生成中止而无需任何MPU配置。

    对于其他模式,如果使用的堆栈大于上面分配的大小(256字节),它将覆盖其他模式的堆栈内容,从而导致代码执行问题。可以使用MPU区域阻止CPU向可用堆栈之外的RAM中写入RAM来识别这些问题。此方法仅用于确定开发过程中每种模式所需的最大堆栈大小。