您好!
我正使用以太网和 LWIP 与电路板进行通信、并尝试以32次(1us - 30ms)的频率测量 ADC。 我正在使用 RTI 计时器来触发转换开始、并在转换结束时触发的 ISR 中读取结果。 并得到了 DNS 问题(请参阅附件)
1.从 RTI 计时器触发 ADC SoC 的好方法吗?
2. 如何检查任务饥饿? 我假设 RTI 和 ISR 不执行 DNS 任务、此时会触发软件计时器、进而导致断言。
3.如果您有其他建议,请告诉。
此致!
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.
您好!
我正使用以太网和 LWIP 与电路板进行通信、并尝试以32次(1us - 30ms)的频率测量 ADC。 我正在使用 RTI 计时器来触发转换开始、并在转换结束时触发的 ISR 中读取结果。 并得到了 DNS 问题(请参阅附件)
1.从 RTI 计时器触发 ADC SoC 的好方法吗?
2. 如何检查任务饥饿? 我假设 RTI 和 ISR 不执行 DNS 任务、此时会触发软件计时器、进而导致断言。
3.如果您有其他建议,请告诉。
此致!
尊敬的 Oleg:
首先、回答您的问题:
可以、从 RTI 计时器触发 ADC SoC 是完全正常的。
2. DNS 任务可能因为低优先级而无法执行,我们可以在澄清后再讨论。
您能 回答几个问题以进一步澄清吗、它将帮助我们为您提供更好的支持。
问题1: 您能否共享中断配置、即转换完成后生成的中断?
问题2. 您能否简单解释一下测量 ADC 频率32次是什么意思?
此处的配置可能导致高延迟、并且不断发出中断、这将剥夺 DNS 任务。
此外、如果可能、您能否共享您的源代码/项目、我们可以在最后用于调试。
此致、
Shaunak
问题1: 您能否共享中断配置、即转换完成后生成的中断?
[/报价]a. RTI 计时器配置:
//setup SoC by RTI trigger /* ADC Interrupt Configuration */ /* Enables an ADC interrupt source. */ ADC_enableInterrupt(ADC_baseAddr, ADC_INT_NUMBER2); /* Sets the source EOC for an analog-to-digital converter interrupt. */ ADC_setInterruptSource(ADC_baseAddr, ADC_INT_NUMBER2, ADC_SOCNumber); /* Enables continuous mode for an ADC interrupt. */ ADC_disableContinuousMode(ADC_baseAddr, ADC_INT_NUMBER2); /* use RTI as trigger of start of conversion */ ADC_setupSOC(ADC_baseAddr, ADC_SOCNumber, ADC_TRIGGER_RTI1, ADC_channel, 16); /* Configures the interrupt SOC trigger of an SOC. */ ////////////////////////////////////////////// TimerP_Params_init(&timerParams); timerParams.periodInUsec = 0; timerParams.periodInNsec = interval_ns; // 30 ms - 1.1 us TimerP_setup(gTimerBaseAddr[CONFIG_TIMER_AI_MON], &timerParams);b.将会生成 EOC 的寄存器中断
/* Register & enable interrupt */ HwiP_Params_init(&hwiPrms); hwiPrms.intNum = CSLR_R5FSS0_CORE0_CONTROLSS_INTRXBAR0_OUT_0; hwiPrms.callback = &AI_mon_ISR; hwiPrms.isPulse = 1; status = HwiP_construct(&gAI_mon.obj, &hwiPrms); DebugP_assert(status == SystemP_SUCCESS); status = SemaphoreP_constructBinary(&gAI_mon.BinSem, 0); DebugP_assert(SystemP_SUCCESS == status);ISR:
static void AI_mon_ISR(void *args) { if (gAI_mon.i < 32) { /* Store result */ gAI_mon.ADC_result_buf[gAI_mon.i] = ADC_readResult(ADC_resultBase, ADC_SOCNumber); ++(gAI_mon.i); ADC_clearInterruptStatus(ADC_baseAddr, ADC_INT_NUMBER2); if(ADC_getInterruptOverflowStatus(ADC_baseAddr, ADC_INT_NUMBER2)) { ADC_clearInterruptOverflowStatus(ADC_baseAddr, ADC_INT_NUMBER2); } } else if (gAI_mon.i == 32) { TimerP_stop(gTimerBaseAddr[CONFIG_TIMER_AI_MON]); /* buffer filled, stop */ SemaphoreP_post(&gAI_mon.BinSem); ++(gAI_mon.i); } }[/quote]问题2. 您能否简单解释一下测量 ADC 频率32次是什么意思?
[/报价]我需要连续32次严格周期性测量 ADC 值。 当第32个周期完成后、停止计时器、并等待下一条命令处理再次开始测量 ADC 的请求。
尊敬的 Oleg:
什么 示例 您正在使用 MCU_PLUS_SDK_am263x_08_05_00_24中的哪些器件? 您可以在 LwIP 库中进行以下更改并重新编译 LwIP 库、重新编译示例
第1步:在 文件: MCU_PLUS_SDK_08_05_00_24/source/networking/lwip/am263x/ lwipopts.h
第2步: 在 行:87处、设置宏 LWIP_DNS 设为0
第3步: 重新编译 LwIP 库。
gmake -sj -f makefile.am263x lwip-freertos_r5f.ti-arm-clang gmake -sj -f makefile.am263x lwip-contrib-freertos_r5f.ti-arm-clang gmake -sj -f makefile.am263x lwipif-cpsw-freertos_r5f.ti-arm-clang
第4步: 重新编译代码(您正在处理的示例)
此致、
Shaunak
尊敬的 Oleg:
为 DNS 进行的函数调用来自 Lwip-stack 中的 dns.c 文件。 仅当我们启用 DNS 功能时、才会编译这些函数。
在我的上述答复中,我们已将 LWIP_dnos 设为0,禁用了 DNS 功能。 因此、nsds_tmr 不应被调用。
1.您能否重新检查您的 lwipopts.h 文件、确保它已
#定义 LWIP_DNS 0
2.然后重新编译 Lwip 库和应用程序。
您能完成上述操作吗?如果您仍遇到任何问题、请联系我。
此致、
Shaunak
大家好、Shaunak!
我使用调试库、需要在编译中添加"profile=debug"。
PROFILE=debug gmake -sj -f makefile.am263x lwip-freertos_r5f.ti-arm-clang PROFILE=debug gmake -sj -f makefile.am263x lwip-contrib-freertos_r5f.ti-arm-clang PROFILE=debug gmake -sj -f makefile.am263x lwipif-cpsw-freertos_r5f.ti-arm-clang
乍一看、DNS 已成功禁用、我看不到 DNS 断言问题。
我将更深入地重新测试它、并解决票证。
感谢您的帮助!