Thread 中讨论的其他器件:CC2650、SYSBIOS、
尊敬的先生:
我们目前正在参与一个通过 I2S 实现音频数据流的项目。 令人遗憾的是,尽管我们作出了努力,但我们在向驾驶员提供必要数据方面仍然遇到困难。 由于音频输出缺乏预期的平滑度、这一问题很明显。 请参见处理缓冲区填充的主题。
void initAudioBuffers() { // Initialize the write-transactions I2S_Transaction_init(&i2sWrite1); I2S_Transaction_init(&i2sWrite2); I2S_Transaction_init(&i2sWrite3); I2S_Transaction_init(&i2sWrite4); i2sWrite1.bufPtr = writeBuf1; i2sWrite2.bufPtr = writeBuf2; i2sWrite3.bufPtr = writeBuf3; i2sWrite4.bufPtr = writeBuf4; i2sWrite1.bufSize = sizeof(writeBuf1); i2sWrite2.bufSize = sizeof(writeBuf2); i2sWrite3.bufSize = sizeof(writeBuf3); i2sWrite4.bufSize = sizeof(writeBuf4); List_clearList(&i2sWriteList); List_put(&i2sWriteList, (List_Elem *)&i2sWrite1); List_put(&i2sWriteList, (List_Elem *)&i2sWrite2); List_put(&i2sWriteList, (List_Elem *)&i2sWrite3); List_put(&i2sWriteList, (List_Elem *)&i2sWrite4); preloadAudioBuffers(); } void preloadAudioBuffers() { generate_stereo_tone(writeBuf1, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, true, 500); generate_stereo_tone(writeBuf2, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, false, 500); generate_stereo_tone(writeBuf3, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, false, 500); generate_stereo_tone(writeBuf4, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, false, 500); } uint32_t loadAudioChunk(uint8 bufferSet) { uint32_t count = 0; if (bufferSet == 1) { count = generate_stereo_tone(writeBuf1, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, false, 500); count = generate_stereo_tone(writeBuf2, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, false, 500); } else if (bufferSet == 2) { count = generate_stereo_tone(writeBuf3, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, false, 500); count = generate_stereo_tone(writeBuf4, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, false, 500); } return count; } void *myTreatmentThread(void *arg0) { int k; I2S_Transaction *lastAchievedTransaction; static bool seqBuf = 0; uint32_t events; printf("Transaction1 address = 0x%x writeBuf1 address = 0x%x\n", &i2sWrite1, &writeBuf1); printf("Transaction2 address = 0x%x writeBuf2 address = 0x%x\n", &i2sWrite2, &writeBuf2); printf("Transaction3 address = 0x%x writeBuf3 address = 0x%x\n", &i2sWrite3, &writeBuf3); printf("Transaction4 address = 0x%x writeBuf4 address = 0x%x\n\n\n", &i2sWrite4, &writeBuf4); initAudioBuffers(); I2S_Setup(); I2S_Transaction_init(&i2sTransaction1); uint32_t bytesRead = 0; uint32_t startTicks, endTicks; uint32_t elapsedTimeTicks; uint32_t bytesSent=0; while (1) { if (playStop == true) { startTicks = Clock_getTicks(); if (writeFinished == true) { // I2S_stopWrite(i2sHandle); seqBuf = !seqBuf; I2S_setWriteQueueHead(i2sHandle, &i2sWrite1); if (seqBuf == 0) { List_put(&i2sWriteList, (List_Elem *)&i2sWrite1); List_put(&i2sWriteList, (List_Elem *)&i2sWrite2); List_tail(&i2sWriteList)->next = List_head(&i2sWriteList); // Write buffers are queued in a ring-list List_head(&i2sWriteList)->prev = List_tail(&i2sWriteList); } else { List_put(&i2sWriteList, (List_Elem *)&i2sWrite3); List_put(&i2sWriteList, (List_Elem *)&i2sWrite4); List_tail(&i2sWriteList)->next = List_head(&i2sWriteList); // Write buffers are queued in a ring-list List_head(&i2sWriteList)->prev = List_tail(&i2sWriteList); // I2S_setWriteQueueHead(i2sHandle, &i2sWrite3); } I2S_startWrite(i2sHandle); writeFinished = false; } if (seqBuf == 0) { bytesSent=loadAudioChunk(2); if (bytesSent >= SAMPLE_RATE-500) { Task_sleep(CLOCK_MS(50)); I2S_stopWrite(i2sHandle); // I2S_stopClocks(i2sHandle); generate_stereo_tone(NULL, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, true, 500); StopSound(); bytesSent=0; endTicks = Clock_getTicks(); elapsedTimeTicks = endTicks - startTicks; } } else { bytesSent=loadAudioChunk(1); if (bytesSent >= SAMPLE_RATE-500) { Task_sleep(CLOCK_MS(50)); I2S_stopWrite(i2sHandle); // I2S_stopClocks(i2sHandle); generate_stereo_tone(NULL, SAMPLE_RATE, 1, TONE_A4_FREQUENCY, true, 500); StopSound(); bytesSent=0; endTicks = Clock_getTicks(); elapsedTimeTicks = endTicks - startTicks; } } } else { I2S_stopWrite(i2sHandle); writeFinished = false; bytesSent=0; Task_sleep(CLOCK_MS(50)); } Task_sleep(CLOCK_MS(50)); } }
尽管采用了多个缓冲区并采用了交替填充方法、但我们无法提高数据吞吐率。 我们尝试使用 ITM 来更深入地研究该问题已遇到阻碍、因为将其集成到我们的项目中会导致以下错误:
"C:/ti/ti_cgt_tiarmclang_1.3.0.LTS/bin/tiarmclang.exe" @"C:/Users/NadeemJamal/workspace_examples/Novax_Touchless_APS_CC1352P7/TOOLS/defines/dmm_154collector_remote_display_app.opts" @"C:/Users/NadeemJamal/workspace_examples/Novax_Touchless_APS_CC1352P7/TOOLS/build_components.opt" @"C:/Users/NadeemJamal/workspace_examples/Novax_Touchless_APS_CC1352P7/TOOLS/factory_config.opt" @"C:/Users/NadeemJamal/workspace_examples/Novax_Touchless_APS_CC1352P7/Release/syscfg/ti_ble_app_config.opt" @"C:/Users/NadeemJamal/workspace_examples/Novax_Touchless_APS_CC1352P7/Release/syscfg/ti_build_config.opt" -march=thumbv7em -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mlittle-endian -mthumb -O0 -DxFEATURE_ENHANCED_ACK -DCOMBO_MAC -DxUSE_ITM_DBG -DTIMAC_ROM_IMAGE_BUILD -DFLASH_ROM_BUILD -DCC13XX -DCC13X2 -DCC13X2R1_LAUNCHXL -DDeviceFamily_CC13X2X7 -DSUPPORT_PHY_CUSTOM -DSUPPORT_PHY_50KBPS2GFSK -DSUPPORT_PHY_5KBPSSLLR -DSUPPORT_PHY_200KBPS2GFSK -DNVOCMP_NVPAGES=2 -DNVSSPI -DDMM_OAD -DSECURITY -DTIRTOS7_SUPPORT -DHEAPMGR_CONFIG=0x80 -DHEAPMGR_SIZE=0x00 -gdwarf-3 -fshort-enums -munaligned-access -funsigned-char -fcommon -ffunction-sections -fdata-sections -march=armv7e-m -Wl,-m"Novax_Touchless_APS_CC1352P7.map" -Wl,-i"C:/ti/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/source" -Wl,-i"C:/ti/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/kernel/tirtos7/packages" -Wl,-i"C:/Users/NadeemJamal/workspace_examples/Novax_Touchless_APS_CC1352P7/Release/syscfg" -Wl,-i"C:/ti/ti_cgt_tiarmclang_1.3.0.LTS/lib" -Wl,--reread_libs -Wl,--define=FLASH_ROM_BUILD=2 -Wl,--define=OAD_IMG_E=1 -Wl,--define=SECURITY=1 -Wl,--diag_wrap=off -Wl,--display_error_number -Wl,--warn_sections -Wl,--xml_link_info="Novax_Touchless_APS_CC1352P7_linkInfo.xml" -Wl,--rom_model -Wl,--unused_section_elimination=on -o "Novax_Touchless_APS_CC1352P7.out" "./syscfg/ti_ble_config.o" "./syscfg/ti_dmm_application_policy.o" "./syscfg/ti_radio_config.o" "./syscfg/ti_drivers_config.o" "./syscfg/ti_log_config.o" "./syscfg/ti_sysbios_config.o" "./OAD/bim_util.o" "./OAD/crc32.o" "./OAD/flash_interface_ext_rtos_NVS.o" "./OAD/mark_switch_factory_img.o" "./OAD/oad.o" "./OAD/oad_image_header_app.o" "./OAD/oad_util.o" "./application/audio/audio_support.o" "./application/audio/tas2560.o" "./application/ble_remote_display/remote_display.o" "./application/ble_remote_display/startup/ble_user_config_stack.o" "./application/ble_remote_display/startup/osal_icall_ble.o" "./application/ble_remote_display/startup/rom_init.o" "./application/ble_remote_display/util/util.o" "./application/cli/console.o" "./application/cli/embedded_cli.o" "./application/cli/xmodem_server.o" "./application/collector/aps_specific_cfg.o" "./application/collector/aps_specific_protocol.o" "./application/collector/collector.o" "./application/collector/csf.o" "./application/collector/link_controller/cllc.o" "./application/collector/util/mac_util.o" "./application/collector/util/util_timer.o" "./application/crc16.o" "./application/file_transfer.o" "./application/main.o" "./application/statistics.o" "./application/task_log.o" "./application/unit_test.o" "./application/cui/cui.o" "./dmm/application_policy/dmm_priority_ble_154collector.o" "./drivers/flash.o" "./drivers/misc.o" "./drivers/tas2560_i2c_driver.o" "./drivers/vibration.o" "./drivers/nv/crc.o" "./drivers/nv/nvocmp.o" "./software_stacks/ble_stack/icall/icall.o" "./software_stacks/ble_stack/icall/icall_cc2650.o" "./software_stacks/ble_stack/icall/icall_user_config.o" "./software_stacks/ble_stack/icall_ble/icall_api_lite.o" "./software_stacks/ble_stack/icall_ble/icall_hci_tl.o" "./software_stacks/ble_stack/icall_ble/rd_ble_user_config.o" "./software_stacks/ble_stack/profiles/devinfoservice.o" "./software_stacks/ble_stack/profiles/gattservapp_util.o" "./software_stacks/ble_stack/profiles/network_device_gatt_profile.o" "./software_stacks/ble_stack/profiles/provisioning_gatt_profile.o" "./software_stacks/ble_stack/profiles/remote_display_gatt_profile.o" "./software_stacks/ble_stack/rosc/rcosc_calibration.o" "./software_stacks/ti15_4stack/mac/hal/target/itm.o" "./software_stacks/ti15_4stack/mac/high_level/mac_cfg.o" "./software_stacks/ti15_4stack/mac/low_level/mac_activity.o" "./software_stacks/ti15_4stack/mac/low_level/mac_settings.o" "./software_stacks/ti15_4stack/mac/services/saddr.o" "./software_stacks/ti15_4stack/osal_port/osal_port.o" "./software_stacks/ti15_4stack/osal_port/osal_port_timers.o" "./software_stacks/ti15_4stack/radio_configuration/mac_user_config.o" "./software_stacks/ti15_4stack/stack_user_api/api_mac.o" "./software_stacks/ti15_4stack/stack_user_api/macTask.o" -Wl,-l"C:/ti/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/source/ti/ti154stack/lib/rom/ticlang/timac_rom_PG2_0_rom_api_linker.cmd" -Wl,-l"C:/Users/NadeemJamal/workspace_examples/Novax_Touchless_APS_CC1352P7/Release/syscfg/ti_utils_build_linker.cmd.genlibs" -Wl,-l"C:/ti/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/source/ti/dmm/apps/common/tirtos/ccs/cc13x2x7_cc26x2x7_app_tirtos7_oad.cmd" -Wl,-lti_utils_build_linker.cmd.genlibs -Wl,-l"C:/ti/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/source/ti/devices/cc13x2x7_cc26x2x7/driverlib/bin/ticlang/driverlib.lib" -Wl,-llibc.a makefile:256: recipe for target 'Novax_Touchless_APS_CC1352P7.out' failed error #10056: symbol "ITM_enableExceptionTrace" redefined: first defined in "./software_stacks/ti15_4stack/mac/hal/target/itm.o"; redefined in "C:/ti/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/source/ti/drivers/lib/ticlang/m4f/drivers_cc13x2x7.a<ITM.c.obj>" error #10056: symbol "ITM_enablePCSampling" redefined: first defined in "./software_stacks/ti15_4stack/mac/hal/target/itm.o"; redefined in "C:/ti/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/source/ti/drivers/lib/ticlang/m4f/drivers_cc13x2x7.a<ITM.c.obj>" error #10056: symbol "ITM_enableSyncPackets" redefined: first defined in "./software_stacks/ti15_4stack/mac/hal/target/itm.o"; redefined in "C:/ti/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/source/ti/drivers/lib/ticlang/m4f/drivers_cc13x2x7.a<ITM.c.obj>" error #10010: errors encountered during linking; "Novax_Touchless_APS_CC1352P7.out" not built tiarmclang: error: tiarmlnk command failed with exit code 1 (use -v to see invocation) gmake[1]: *** [Novax_Touchless_APS_CC1352P7.out] Error 1 makefile:252: recipe for target 'all' failed
我们正在积极寻求解决此问题的方案、非常感谢您为应对这些挑战而提供的任何见解或建议。 对于如何实现此问题,您有什么建议?调试此问题的最佳方法是什么?
感谢您的关注。