工具/软件:
团队、
F29x 架构由于其 CPU 架构、允许并行加载和存储。 如果出现存储器停滞、是否有办法在 Code Composer Studio 中查看这些错误? 也许通过读一些统计寄存器?
分析并行存储器访问是否会导致 CPU 停滞、在这种情况下播放存储器放置位置可能会提高性能、这将非常有用。
谢谢、
Robert
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.
工具/软件:
团队、
F29x 架构由于其 CPU 架构、允许并行加载和存储。 如果出现存储器停滞、是否有办法在 Code Composer Studio 中查看这些错误? 也许通过读一些统计寄存器?
分析并行存储器访问是否会导致 CPU 停滞、在这种情况下播放存储器放置位置可能会提高性能、这将非常有用。
谢谢、
Robert
您好 Robert:
我创建了一个使用 r1_ready 和 exe_ready 来捕获等待状态和内存保护停止的示例。
exe-ready 计数 :这是由于读写内存等待状态而导致的停止计数。 请注意、由于存储器保护而导致的流水线停滞不会显示在此处。
R1就绪计数 :这是由于读取等待状态和内存保护停止而导致的停止计数。
ERAD_Counter_Config sec_params; ERAD_setCounterOwnership(ERAD_COUNTER0, ERAD_OWNER_APPLICATION); sec_params.event = ERAD_EVENT_CPUx_CPI_R1_READY; sec_params.event_mode = ERAD_COUNTER_MODE_ACTIVE; sec_params.reference = 0xFFFFFFFF; ERAD_setCounterInputConditioning(ERAD_COUNTER0, ERAD_COUNTER_COUNT_INPUT, ERAD_INPUT_INVERT_ENABLE); ERAD_configCounterInCountingMode(ERAD_COUNTER0, sec_params); ERAD_setCounterOwnership(ERAD_COUNTER1, ERAD_OWNER_APPLICATION); sec_params.event = ERAD_EVENT_CPUx_CPI_EXE_READY; sec_params.event_mode = ERAD_COUNTER_MODE_ACTIVE; sec_params.reference = 0xFFFFFFFF; ERAD_setCounterInputConditioning(ERAD_COUNTER1, ERAD_COUNTER_COUNT_INPUT, ERAD_INPUT_INVERT_ENABLE); ERAD_configCounterInCountingMode(ERAD_COUNTER1, sec_params); ERAD_enableModules(ERAD_INST_COUNTER0 | ERAD_INST_COUNTER1);
我正在尝试以将其添加到我们的 SDK 中为例、也可能会将其添加为我们的 TRM 中的小节。
此致、
Ryan Ma
您好 Robert:
以下是一个完整的示例、您可以复制并粘贴到 ERAD ex1_profile_function_no_syscfg.c 中、其中展示了如何执行启动/停止模式来查找存储器停滞。
我使用 EBC BUSCOMP7/6来触发 SEC 计数器0/1的启动/停止计数器条件。 使用 r1_ready 作为 SEC0的源、使用 exe_ready 作为 SEC1的源。
您可能需要更新结束地址、以防您的结束地址因某种原因而不同。
//############################################################################# // // FILE: erad_ex1_profile_function_no_syscfg.c // // TITLE: ERAD Profile Function. // //! \addtogroup driver_example_list //! <h1>ERAD Profile Function</h1> //! //! This example uses BUSCOMP7, BUSCOMP6 and COUNTER0 of the ERAD module to //! profile a function (delayFunction). It calculates the CPU cycles taken //! between the the start address of the function to the end address of the //! function //! //! Two dummy variable are written to inside the function - startCount and //! endCount. BUSCOMP5, BUSCOMP4 and COUNTER1 are used to profile the time //! taken between the access to startCount variable till the access to //! endCount variable. //! //! Both the counters are setup to operate in START-STOP mode and count the //! number of CPU cycles spend between the respective bus comparator events. //! //! Note: The Enhanced Bus Comparator (EBC) modules are used in the //! decreasing order of their instances in this example. This is because, in //! FLASH configuration/ when hardware breakpoints are used while debugging, //! the first few ERAD EBCs are owned by the Debugger and are blocked for the //! application to use. //! //! \b Watch \b Variables \n //! - cycles_Function_Max - the maximum number of cycles between the start //! of function to the end of function //! - cycles_Function_Min - the minimum number of cycles between the start //! of function to the end of function //! - cycles_Data_Max - the maximum number of cycles taken between //! accessing startCount variable to endCount //! variable //! - cycles_Data_Min - the minimum number of cycles taken between //! accessing startCount variable to endCount //! variable //! //! \b External \b Connections \n //! None // //############################################################################# // // Included Files // #include "driverlib.h" #include "device.h" #include "erad.h" // // Global Variables // // // Start and end address of the function delayFunction. // This value comes from the linker command file. // extern uint32_t delayFuncStart, delayFuncEnd; // // The variables used in the function which are monitored by bus comparators // 3 and 4. // volatile uint32_t startCount = 0; volatile uint32_t endCount = 0; // // Watch variables with the number of CPU cycles elapsed. // volatile uint32_t cycles_Function_Max = 0; volatile uint32_t cycles_Function_Min = 0xFFFFFFFF; volatile uint32_t cycles_Data_Max = 0; volatile uint32_t cycles_Data_Min = 0xFFFFFFFF; ERAD_Profile_Params params; // // Function Prototypes // __attribute__ ((section(".delayFunc"), noinline)) void delayFunction(uint16_t); // // Main // int main(void) { uint16_t i; // // Initializes device clock and peripherals // Device_init(); // // Parameters for profiling function. // The PC value is being monitored here. // params.start_address = (uint32_t)&delayFuncStart; params.end_address = (uint32_t)&delayFuncEnd - 4U; params.bus_sel = ERAD_BUSCOMP_BUS_VPC_I_ALIGNED; params.busComp_instance1 = ERAD_BUSCOMP7; params.busComp_instance2 = ERAD_BUSCOMP6; params.counter_instance = ERAD_COUNTER2; // // Configuring the required ERAD submodules // ERAD_profile(params); // // Parameters for profiling the time between the accesses // to startCount and endCount variables. // The address in the Data Write Address Bus is monitored here. // params.start_address = (uint32_t)&startCount; params.end_address = (uint32_t)&endCount; params.bus_sel = ERAD_BUSCOMP_BUS_DWAB; params.busComp_instance1 = ERAD_BUSCOMP5; params.busComp_instance2 = ERAD_BUSCOMP4; params.counter_instance = ERAD_COUNTER3; // // Configuring the required ERAD submodules // ERAD_profile(params); ERAD_Counter_Config sec_params; ERAD_setCounterOwnership(ERAD_COUNTER0, ERAD_OWNER_APPLICATION); sec_params.event = ERAD_EVENT_CPUx_CPI_R1_READY; sec_params.event_mode = ERAD_COUNTER_MODE_ACTIVE; sec_params.reference = 0xFFFFFFFF; ERAD_setCounterInputConditioning(ERAD_COUNTER0, ERAD_COUNTER_COUNT_INPUT, ERAD_INPUT_INVERT_ENABLE); ERAD_configCounterInStartStopMode(ERAD_COUNTER0, sec_params, ERAD_EVENT_EBC7, ERAD_EVENT_EBC6); ERAD_setCounterOwnership(ERAD_COUNTER1, ERAD_OWNER_APPLICATION); sec_params.event = ERAD_EVENT_CPUx_CPI_EXE_READY; sec_params.event_mode = ERAD_COUNTER_MODE_ACTIVE; sec_params.reference = 0xFFFFFFFF; ERAD_setCounterInputConditioning(ERAD_COUNTER1, ERAD_COUNTER_COUNT_INPUT, ERAD_INPUT_INVERT_ENABLE); ERAD_configCounterInStartStopMode(ERAD_COUNTER1, sec_params, ERAD_EVENT_EBC7, ERAD_EVENT_EBC6); ERAD_enableModules(ERAD_INST_COUNTER0 | ERAD_INST_COUNTER1 | ERAD_INST_COUNTER2 | ERAD_INST_COUNTER3); // // Loop to call the delay function repeatedly with different delays // for(i=0; i<10; i++) { delayFunction(i % 5); // // View these variables in CCS view // Note that calling the function ERAD_getCurrentValue here will // return 0 since the stop events have already been occurred. // cycles_Function_Max = ERAD_getMaxCount(ERAD_COUNTER0); cycles_Data_Max = ERAD_getMaxCount(ERAD_COUNTER1); cycles_Function_Min = ERAD_getMinCount(ERAD_COUNTER0); cycles_Data_Min = ERAD_getMinCount(ERAD_COUNTER1); ESTOP0; // // Uncomment the code below to clear the maximum and minimum count // // ERAD_setMaxCount(ERAD_COUNTER0, 0); // ERAD_setMaxCount(ERAD_COUNTER1, 0); // ERAD_setMinCount(ERAD_COUNTER0, 0xFFFFFFFF); // ERAD_setMinCount(ERAD_COUNTER1, 0xFFFFFFFF); } ESTOP0; while(1); } // // Delay function // void delayFunction(uint16_t delay) { startCount++; uint16_t some_math = 15*4; uint16_t i = 0; for (; i < delay * 100; i++) { NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; uint16_t output = some_math * 35 - 3 + 139 * startCount; } endCount++; } // // End of File //
此致、
Ryan Ma
您好、 Vivek Singh、
我得为我迟交的答复道歉。 我已经尝试过您的示例、但在链接时仍然收到以下错误:
...
[9] makefile:185:目标"HVB3_OBC_F29_001.out"的配置失败
[10]警告#10247-D:创建不带段规范的输出段".delayFunc"
[11]未定义的首次引用
[12]文件中的符号
[13]——— ------------------------
[14] delayFuncEnd /work/bsw/firmware/config/stu/erad_ex1_profile_function_no_syscfg.o
[15] delayFuncStart /work/bsw/firmware/config/stu/erad_ex1_profile_function_no_syscfg.o
[16]错误#10234-D:保留未解析的符号
[17]错误#10010:链接时遇到错误;"HVB3_OBC_F29_001.out"未构建
[18]c29clang:错误:c29lnk 命令失败、退出代码为1 (使用-v 查看调用)
[19]gmake[1]:***[HVB3_OBC_F29_001.out]错误1
[20]makefile:181:目标"全部"的配方失败
[21]gmake:***[全部]错误2.
您有什么 解决方法吗?
我正想使用 address 运算符作为 start 和 sizeof ()来获得结尾 您认为这是合理的吗?
此致、
安德烈
您好 Andre、
您有没有 办法解决?
[/报价]您能否导入 ERAD ex1_profile_function_no_syscfg 并将其内容替换为我提供的内容?
这可能是因为您的 HVB3_OB_F29_001工程没有在链接器 cmd 文件中定义这些函数。 在我们的示例中、我们使用以下.cmd 文件设置起始/结束地址。
此致、
Ryan Ma