【上海航芯 ACM32F070开发板+触控功能评估板】—— 测试技巧和思考笔记
[复制链接]
例程测试 大部分例程执行过程都是:
-
Reset_Handler
-
System_Core_Config()
-
__main(), (编译器C运行时库的堆、栈、有初始值变量的初始化等设置)
-
main()
-
System_Init()
-
Uart_Init()
-
APP_XXX_Test()
前面几项都基本相同,不同的例程测试代码都在APP_XXX_Test函数里,位于App.c源文件中。
APP_XXX_Test简化多次编译调试的技巧
ACM的例程ModulesDemo中,很多程序都是多个功能测试函数集合,成为一个函数,将不同的功能测试设置一个 fe_Mode ,然后在main函数里的APP_XXX_Test(fe_Mode),例如:
/* GPIO_OUTPUT、GPIO_INT、GPIO_PC13、LED_BLINK */
APP_GPIO_Test(LED_BLINK);
对于每次测试,都需要将main函数中的这个值修改,然后编译、下载、调试,比较耗时。
经过多次探索,发现可以使用两种方法,即可在不改变代码的条件下,一次调试中完成多项功能的测试。
-
- 修改寄存器R0
-
-
在APP_XXX_Test函数最前面打上debug断点。
-
调试界面下,点击run后,停留在刚刚设置的断点处。
-
观察对应的反汇编代码,发现 fe_Mode 传递参数是存储在寄存器R0里,然后比较R0与相应的emum_Mode_t ,从而执行不同的功能测试代码。
-
因此,修改寄存器R0,就可以执行对应的测试,无须在main函数中修改 fe_Mode 再重新编译下载调试这种费时操作。
-
- 修改寄存器PC
-
-
在APP_XXX_Test函数最前面打上debug断点。
-
调试界面下,点击run后,停留在刚刚设置的断点处。
-
选择想要跳转执行的代码,利用Keil调试界面的“Change Program Counter”,可以直接将PC指向当前行。
中断ISR与主函数main之间的一个问题思考
- 如图,参考GPIO例程中的GPIO_INT功能测试代码,考虑以下场景:
-
如果两个中断来的比较接近,在main函数进入到,还未来得及设置中断标志变量 gu32_GPIOIRQ_Flag 为false,下一个中断又立刻到来,此时进入ISR中断服务例程,将 gu32_GPIOIRQ_Flag 设置为true,然后退出ISR后恢复执行main,此时main才将 gu32_GPIOIRQ_Flag 设置为false,将刚才的中断标志覆盖,导致丢失一次中断。(因此要求中断标志位的设置必须尽快完成?那么对于高频次的外部信号,该如何设计呢?)
RTC调试无复位的影响
RTC例程中,没有对RTC模块进行复位操作,调试复位以及nRST复位,都不能复位RTC,在多次调试过程中,前一次的调试对RTC的设置会影响下一次调试,需要断电后再重新调试,否则出错。
|