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.

[参考译文] CCS/CCStudio:存储在存储器浏览器中的随机值

Guru**** 2589300 points
Other Parts Discussed in Thread: AM3359, SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/612992/ccs-ccstudio-random-values-stored-in-the-memory-browser

器件型号:CCStudio
Thread 中讨论的其他器件:AM3359SYSBIOS

工具/软件:Code Composer Studio

尊敬的所有人:

我正在 CCS 中开发一种数据转换方法、并且面临以下问题。

给定:包含 typedef 结构和 char*变量的头文件。

要求:从头文件中读取这些变量的值。

问题:从变量中读取的某些值与头文件中的值不同,但似乎是某种垃圾。 例如、 符号"@"、"^8DH0L|***"、"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"

根据我的观察、存储在存储器浏览器中的值是错误的、因此读取的值是意外的。

例如、

在头文件中,变量 char * label_id_attr 的值为“032”,但内存浏览器中的值为“@”

内存浏览器的屏幕截图:

在另一个点、变量中存储在不同结构中的值、char * label_id_attr ="0354"、存储器浏览器具有相同的值。

这很奇怪...

可能需要的详细信息、

头文件的文本文件编码:UTF-8

CCS 版本:6.0.1.00040

编译器版本:TL v5.1.4

系列:ARM 通用 CortexA8器件

器件:TI XDS100v2 USB Emulator_0/Cortex A8

板:ICE_AM3359 (在目标配置中)

请帮助我解决此问题、如果您需要更多详细信息、请告诉我。

谢谢、

Bhavanithya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bhavanithya、

    我看到这些值显示在外部 DDR 中、因此我不能不认为它可能存在一些初始化问题、或者其他一些问题、例如代码优化、 这可能会导致存储奇怪的值、因为它们可能不会始终在存储器中可用。

    另一个详细信息:如果您使用的是非常旧的 CCS 版本、则用于正确初始化其硬件的 GEL 文件可能非常旧。 您能否更新 Sitara 器件支持包并获取更新的 AM3359 ICE GEL 文件? 如果您的电路板为 v2、这一点尤为重要。

    参考资料: e2e.ti.com/.../1617136

    要完全确定这一点、您是否会考虑分享重现此问题的测试案例?

    此致、
    拉斐尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Refael、

    感谢你的答复。

    我可以展示供您参考的代码片段、

    头文件如下所示、

    A429RxLabel 位于 testModule (父树枝)内。 这只是 rxlabel 中的一个块、有许多类似的块、

    我正在尝试使用以下代码片段获取 label_id_attr 的值,该值是 char*,

    char* label_id_config = 0; 
    对于(i = 0;i < Module_size;i++){ 
    对于(j = 0;j < Rxlabel_size;j++){
    label_id_config = testbench.Module.Module.Module.HardwareContainer[1].A429RxChannel.A429RxLabel[j].label_id_attr;
    if (label_id_config!=0)
    printf ("label_id_config =%s \n"、label_id_config);



    结果:label_id_config =@μ s
    预期:label_id_config = 032


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bhavanithya Thiraviaraja65"]在头文件中,变量 char * label_id_attr ="032"在某个点,但内存浏览器中的值为"@" 当程序到达 main 时,内存浏览器是否显示了 label_id_attr 的正确值?

    或者是否稍后出现损坏的值?

    尝试了解您是否遇到 CCS 问题、硬件问题或正在运行的程序是否损坏了内存。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    切斯特、您好!

    内存浏览器在到达 main 时显示正确的值、

    可以看到下面、地址0x8004066c 的"032"

    但是、在程序运行后、该值会损坏、

    那么、您认为代码有问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bhavanithya Thiraviaraja65">您是否认为代码有问题?这似乎是软件问题、导致内存被覆盖。

    程序位于 main 位置后、设置一个硬件观察点、用于写入地址 0x8004066c、然后运行程序。 如果软件覆盖该地址、则硬件观察点应通过中断写入来确定原因。

    请参阅 配置硬件观察点 (参考的 Wiki 页面是为 ARM Cortex-M4编写的、但应适用于 Cortex-A8)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我可以看到、部分 TI 代码会覆盖存储器、

    我已附加负责覆盖存储器的 c 文件、

    代码文件中覆盖的代码部分(函数  relocated_reload _code ())如下所示

    void relocated_reload (){
       uint32 itr = 0;
       uint32 len =(uint32)&APP_RELOAD_CODE_SIZE;
       uint32 * src =(uint32 *)&APP_RELOAD_CODE_START;
       uint32 * dest =(uint32 *)&app_reload 代码_run;

       对于(itr = 0;itr < len;itr++){
          dest[itr]= src[itr];
       }

     

    /**
    * utils.c
    *
    
    *版权所有(c) 2012 Texas Instruments Incorporated 保留所有权利
    *
    /
    #include "ecat_def.h"
    //获取加载为头文件的固件!
    #include "ecat_frame_handler _bin.h"// EtherCAT 帧处理程序
    #include "ecat_host_interface_bin.h"// EtherCAT 主机接口
    #include "gpio_v2.h"
    #include "soc_am335X.h"
    #include "ctiv_interface_bin.h"#include "ecat_delta ram_iptine_ram_en_en_ench_ine_delta #tive.tiv_iptine_tive.tine_tiv_delta
    
    
    
    
    
    #include "tiv_iptiv_iptin_tin_tin_en_en_en_delta #tive.tiv_iptin_iptin_en_en_en_tine.tin_tin_delta
    
    #include "tive.tiv_tiv_iptin_deltiv_iptin_t_
    SYNC_max;
    #endif
    #include "osdrv_oledlcd.h"
    #include "osdrv_mcspi.h"
    
    #include "displayUtils.h"
    #include "sphw.h"
    #include "arincUtils.h"
    #include 
    #include 
    #include 
    #include "hi3200helper.h"
    #include "ecatArincAPI.h"
    #include "displayUtils.h"
    #include "ecat_host_interface_bin.h"
    #include "global_conf.h"
    
    uint8 uartInstance= 4;
    uint8 uintboardType = AM335X_Board_type_example_V2;#include "global_conf.402*
    
    uinth
    
    
    
    
    
    
    = uinth;uinteDP402_di402_di_inth = uenth = uinth;uinteDP0_eDP0_int_inth = uint_int_inth = uint_int_inth = uinth;uinth uinth i_inth i_inth i402_di_inth uinth i402_di_int_inth = uinth = uinth uinth = uinth uinth = uinth;uinth uinth u
    
    
    
    #endif
    
    Task_handle tasketHnd;// ECAT 主循环
    Task_handle taskArincHnd;// ARarg2主循环
    Task_handle displayHnd;
    
    semaphore_handle SEM;
    
    #ifdef enable_PDI_task
    ;// ECAT SW ISR
    #else
    #ifdef enable_wi_Swi;semaphore_task/udf
    
    
    
    
    任务处理#isd/ andf 任务处理#uditle/uditle/uditle/udef 任务处理#iftask/udef
    
    
    
    
    #ifdef ENABLE_SYNC_TASK
    // ECAT SYNC0 ISR
    Task_Handle sync0Task;
    void Sync0task (UArg arg0、UArg arg1);
    // ECAT SYNC0 ISR
    Task_handle out1Task;
    void Sync1task (UArg arg0、UArg
    
    
    
    
    
    
    
    
    
    
    
    
    Float);#endif UART1 INT32 appState = void verture/define UCC1ture_freq1;#define AUrate#freq1Hz;#freq1rate#define AUrate#freq1rate#define CP0_freq1Hz
    /*时钟比率 CPU/TIMESTAMP*/
    Timestamp_getFreq (&freq1);
    BIOS_getCpuFreq (&freq2);
    Factor =(Float) freq2.lo / freq1.lo;
    printf ("\r\n%Lu\t%Lu\t%Lu\t%Lu\t Timestamp Freq、BIOS Freq1、freq1"、freq1、freqlo freq2.lo、(uint32)因子);
    }
    
    void Ethercat (UArg0、UArg0 arg1){
    printf ("\nEthercat 任务已启动。");
    uint8 u8Err = 0;
    Task_Params 任务 Params;
    #ifdef enable_PDI_SWI
    Swi_Params swiams;
    
    
    包含#iftog_Outfu_pru_rfu_rands
    
    数组;#iftask_Outfu_pruf 数组中包含#iftask_outnRAM 固件的#iftagesu_udesu_pru_pru.
    如果应用程序构建为完全从内部 RAM 执行、则
    将 PRU 指令扩展为存储在 SPI 闪存中、并且
    不需要此映射*/
    bsp_set_pru_firmware ((UINT32*) FrameProc、sizeof (FrameProc)、(UINT32*) HostProc、sizeof (HostProc);
    #endif
    
    (LEDInf);
    if (AM335X_Board_type_ice_V2 == boardType){
    UTILsInitCpswIcsPorts (ICSS_switch);
    // ICE V2
    SpiFlashInit (0、0)上的 McSPI 实例0;
    }否则(AM335X_Board_type_ICE = boardType){
    //McSPI instance 0
    
    
    
    (SpiFlash 0);}McSPI instance 0 (SpiFlash 0);}
    
    
    /*初始化硬件和 EtherCAT 从站控制器*/
    HW_Init();
    
    //增加 SYNC0 PRUSS ISR 和 CMD,CMD_ACK ISR 由 PRUSS 驱动程序完成
    //设置计时器优先级
    Hwi_setPriority (68,0x23);
    
    u8Err=MainInit();// EtherCAT 栈
    
    #if Input_Mapping*(_Generatures)
    
    
    
    ;//创建 EtherCAT IDis&P402*Output_Input_Input_Output_Isold_Modules;//初始化结构
    #endif
    /*创建任务*/*
    创建共享资源的树任务*/
    #ifdef enable_PDI_task
    Task_Params_init (&taskParams.priority
    = 6;taskParams.STACKSIZE
    = 1512;
    pdiTask = Task_create (PDItask、taskParams、&taskParams、 空);
    #else
    #ifdef enable_PDI_SWI
    Swi_Params_init (&swiParams);
    swiParams.priority = 6;
    pdiSwiSwi = Swi_create (PDIswi、&swiParams
    
    
    
    、NULL);#endif #ifdef enable_sync_taskTask_Params_priority (&taskParams
    
    
    =任务);任务&taskparams =任务 parc012_params;任务&taskparparams =任务 parparams.params =任务 parparams;任务 parpartask.params =任务 空);
    
    Task_Params_init (&taskParams);
    taskParams.priority = 8;
    taskParams.STACKSIZE = 1512;
    synct1Task = Task_create (Sync1task、 taskParams、NULL);
    #endif
    
    #ifdef ENABLE_DC64BIT_TEST
    Task_Params_init (&taskParams);
    taskParams.priority = 3;
    testTsk = Task_create (testTask、&INTParams、NULL);
    #endif
    
    (u8Err = 0){bRunsys.priority
    = 3;task_stack
    
    = true_stack;#maintime_stack (#maintime_stack
    
    
    
    );#maintime_stop_loop (&track_stop_stop_une_stack = 1);#main&track_stop_time_stop_loop;#main&track = 0_stop_stop
    
    mainloop();
    #ifdef profile_ECAT_stack
    bsp_get_local_sys_time (&mainloop_stop、0);
    if (mainloop_stop >= mainloop_stop
    - maprloop_start;
    else
    mainloop_delta = 0xFFFFFF_start+mainloop_stop;
    
    
    
    
    
    
    
    
    
    
    if
    
    = 0xmainloop_reload = 0xmain_delta (
    
    if);if)+ mainloop_deltes_deltes_deltes_deltes_deltes_en_en_preltag_100 (if)(if)(#ma_deltag_ma_ma_ma_enloop = 0xFFFFFF_deltag_deltag_deltag_deltag_deltag_deltag_deltag_ma_en_en/(if);if)(#mainloop = 0xFFFFFF_ma_deltag_deltag_ma_ma_ma_ma_deltes
    while (bRunApplication == true);
    }
    
    hw_Release();
    
    BIOS_exit (0);
    }
    
    void updateDisplay (uint8 lineIndex){
    if (doSwitchForm!=0xff){
    switchForm (doSwitchForm、uartInstance);
    doSwitchForm=0xff;
    Task_sleep (2000);
    }
    if (debug_mode){
    1 + 1、因为显示值为空值保留。
    char ecatStatusStringsVal[2]={0x00、lineIndex + 1};
    char holtStatusStringsVal[2]={0x00、readMCR ()};
    switch (displayedMode){
    case display_mode_monitoring:
    writeVisiGenieObject (0x11、3、ecatStatusStringsVal、uartStance_Steping
    );任务(5);
    writeVisiGenieObject (0x11、7、holtStatusStringsVal、uartInstance);
    break;
    case display_mode_AMT:
    writeVisiGenieObject (0x11、4、ecatStatusStringsVal、uartInstance);
    break;
    case display_mode_amt_edit:
    writeVisiGenieObject (0x11、5、ecatStatusStringsVal、uartInstance);
    break;
    }
    
    }
    //页眉和页脚
    if (lineIndex =0){
    switch (displayedMode){
    case display_mode_monitoring:
    //数据速率
    if (displayedMonitoringDataRate!= data_rate){
    updateDataRate (display_mode_monitoring、data_rate、0x0、uartInstance);
    }
    
    //OP 模式
    if (data_monitoring_status
    
    
    
    
    );display_apart_monitoring (display_ordination_status_display_display_monitoring
    
    
    
    
    break;
    case display_mode_AMT:
    //Data rate
    if (displayedAMTDataRate!= data_rate){
    updateDataRate (display_mode_AMT、data_rate、0x0、uartInstance);
    }
    
    
    //OP Mode
    if (displayedAMTOPState!= opardion_mode){
    updateOpMode (display_at_rate、data_status、0xnattrat_status=}/apat_uat_uat_display_status_uat_uat_uattrat_display_uat_uat_uat_uat_display_uattran./uat_status.uat_display_uat_uat_uat_uat_uat_uat_uat_uattran./uat_uat_display_uat_uat_display_uat_uat_
    
    
    
    
    
    
    
    
    break;
    case display_mode_amt_edit:
    //Data rate
    if (displayedAMTEditDataRate!= data_rate){
    updateDataRate (display_mode_amt_edit、data_rate、0x0、uartInstance);
    }
    
    
    //OP Mode
    if (displayedAMTEditState!= opartion_mode){display_amat_edat_udit_ude_display_at_udit_at_ude_display_at_udit_ude_display_udit_at_ude_display_udit_at_ude_display_udit_at_ude_display_udit_udit_udit_at_at_at_ude_display_ude_display_udit_udit_am_at_at_ude_display_ude_display_udit_ude_display_udit_udeat_udit_udeat_udeat_udeateginat_udit_
    
    
    
    
    
    
    
    
    break;
    case display_mode_info:
    //Data rate
    if (displayedInfoDataRate!= data_rate){
    updateDataRate (display_mode_info、data_rate、0x0、uartInstance);
    }
    
    
    //OP Mode
    if (displayedInfoOPState!= opardion_mode){
    updateOpMode (display_mode_mode_data_status、0xnat_status
    
    
    
    );display_apart_at_status_ap_uat_uat_uat_uat_status
    ;
    
    }
    
    break;
    }}
    
    
    //Main Content
    switch (displayedMode){
    case display_mode_monitoring:
    if (lineIndex =2 && display_monitoring_selected_page!= displayedMonitoringPage){
    monitoreMonitoringPage (display_monitoring_selected_page、0x0、uartInstance
    
    
    
    
    Index);}if (lineIndex =4 && displayedMonitoringPage (display_monitoring_detique)、uniartestion_updateIndateMonitoring= 0x0、updateInquotion_updateInquotioninguartinguartestation= updateIndateMonitoringuestoringuartestoringuestoringuestoringuestoringuestoringuartestoringuartestore
    中断;
    案例 DISPLAY_MODE_AMT:
    
    //通道
    IF (lineIndex == 2 && DISPLAY_AMT_CHANNEL!= displayedAMTChannel){
    updateAMTChannel (display_d倒 计数通道、0x0、uartInstance);
    }
    //页面
    IF (lineIndex =4 && display_AMT_SELECTED_PAGE!= displayedAMT_AMT_CHANNEL、0x0、uart_INSTACD- n
    
    
    
    
    
    
    );{</DISPLAY_DISPLAY_DISPLAY_INTRY_INTRY_INTRY_INTRY_INTRY_REGPT_ENDINTRY_REGPT_ENDINTRY_REGPT_END_(例如、AMT_INTRY_INTRY_INTRY_INTRY_INTRY_INTRY_INTRY_INTRY_INTRY_INTRY_REGPT_
    loadAMTLine (uartInstance、display_amt_maincontent_line_print_d倒 计数);
    }
    break;
    case display_mode_amt_edit:
    displayAMTEdit (lineIndex、uartInstance);
    break;
    case display_mode_info:
    displayInfo (lineIndex、uartInstance);
    break;
    }
    
    
    void taskArinc (UARg arg0、UARg arg1){
    printf ("\nArinc task started.");
    while (1){
    semaphore_indc (SEM、BIOS_wait_forever);
    //Task_sleep (5
    
    
    
    
    
    
    )= task_board_arf (
    
    *= 1);task_ar_ex_ar_ex_u_uarf = 1);task_board_ex_inc = 1 (= 1);task_arf = 1);task_board_ex_ex_at_ar_ar_u_inc = 1 (= 1);task_ex_board_ex_ex_ar_uart_inc = 1 =
    
    char lcd_str2[]={"UART TEST APP"};
    
    if (FAIL!= OLEDInit()){
    OLEDShowString (1、(unsigned char *) LCD_str1、0、0);
    OLEDShowString (1、unsigned char *) LCD_str2、1、0);
    OLEDDeactivate1
    (ContinuousScroll (0x01、OLEuScroll); 0x01、Max_Column、0x00、0x00、0x01、 0x06、0x01);
    }
    uint8
    
    线路索引=0;
    while (1){
    updateDisplay (lineIndex);
    线路索引=(1 +线路索引)% display_monitoring_MAX_entrys;
    Task_sleep (1200 / display_monitoring_MAX_entrys);
    }
    
    
    #ifdef enable_PDI_task
    
    //简单中断服务例程(
    如果从 EPDI_stack
    
    启动#if_event_eTOP_32)
    
    /*获取 AL 事件寄存器*/
    bsp_get_local_sys_time (&PDI_start,0);
    #endif
    PDI_ISR ();
    #ifdef profile_ECAT_stack
    bsp_get_local_sys_time (&PDI_stop,0);
    PDI_Delta = PDI_STOP - PDI_START;
    IF (PDI_Delta > PDI_max)
    PDI_max = PDI_Delta;
    #endif
    }
    #endif
    
    void PDItask (UARg arg1、UARg arg2){
    Task_sleep (10 * OS_TICKS_IN_Milli_SEC);
    #if AL_EVENT_ENABLED
    while (UARG arg1、UARG arg2);}
    * USPRUSTRUSAR_PREVENT/事件
    处理*
    
    
    #endif
    }
    #else
    #ifdef ENABLE_PDI_SWI
    void PDISwi (UARg arg1、UARg arg2)
    {
    #ifdef profile_ECAT_STACK
    UINT32 PDI_START、PDI_STOP;
    //获取 AL 事件寄存器*
    bsp_get_local_sys_time (&PDI_start、0);
    #endift_stack
    (PDI_time_get_get_get_time_pbspi_time_t&nat_time_pk_get_time_t&nat_t&nat_top_0);
    
    
    PDI_Delta = PDI_STOP - PDI_START;
    IF (PDI_Delta > PDI_max)
    PDI_max = PDI_Delta;
    #endif
    }
    void PDI_Swi ()
    {
    Swi_pdiSwi);
    }
    #endif
    #endif #endif #endif #enable_SYNC_task #endif (
    
    
    UARTMSG Putg、UART0
    
    
    
    
    
    );#endiftask #endif #endiftask #task #endif_uniRTUARTx_endif (UARTHRIST_ENTRUART0、UCC_ENTRUCC_ENTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUTRU0)
    
    
    
    
    //do synct0事件处理
    disable_esc_int();
    #ifdef profile_ECAT_stack
    bsp_get_local_sys_time (&SYNC_start、0);
    #endif
    Sync0_isr ();
    #ifdef profile_ECAT_stack
    bsp_get_local_sys_time (&SYNC_stop、 0);
    SYNC_Delta = SYNC_STOP - SYNC_START;
    IF (SYNC_Delta > SYNC_max)
    SYNC_max = SYNC_Delta;
    #endif
    ENABLE_ESC_INT ();
    #ifdef DC_SYNC_IRQ_DETARAY_DEBUG
    GPIOPINWrite (SOC_GPIO_1_regs、SYNC0_HWI_GPIO_PIN_NUM_LOW、GPIO_PIN_LOW);
    #endif
    }
    
    
    void Sync1task (UARg arg1、UArg arg2){
    #ifdef profile_ECAT_stack
    UINT32 SYNC_START、SYNC_STOP;
    #endif
    #ifndef EXEC_FROM
    #ifnRAM #ifndef NO_UART_MSG_APP
    //UARTInstack (uartInstance_SYNC_TRUCC1_RETOP_STACT_UNT
    
    
    
    
    
    
    
    
    
    
    )#iftask (#iftask_SYNC_ENTRUCC1_ENTRUCC1_RETOP_ENTRUST_TRUPT0);#ENTRUST_SYEST_SYNC_TRUST_SYNC_TRUST_TRUST_TRUST_TRUTRUTRUTRUTRUTRUTRUT1 (#ENTRUST_SYEST_SYNC_TRUTRUST_TRUT1、#ENTRUST_TRUST_SYNC_TRUTRUST
    0);
    SYNC_Delta = SYNC_STOP - SYNC_START;
    IF (SYNC_Delta > SYNC_max)
    SYNC_max = SYNC_Delta;
    #endif
    ENABLE_ESC_INT ();
    #ifdef DC_SYNC_IRQ_DETARAY_DEBUG
    GPIOPINWrite (SOC_GPIO_1_regs、SYNC0_HWI_GPIO_PIN_NUM_LOW、GPIO_PIN_LOW);
    #endif
    }
    #endif
    
    
    
    
    void txRateHandler(){
    txRateFreqIndex++;
    
    if (ARINC_AUTO_reconfiguration){
    //检查 ARINC SEND 配置是否正确,如果不正确,则进行修复。
    if (readmcr ()!= 0xc0){
    //initHi3200 (1);
    writeMCR (0xC0);
    
    writeATXControlReg ();
    // ARXControl 写入只能在运行级别0中访问。
    setRun (0);
    writeARXControlReg ();
    setRun (1);
    }
    
    if (option_mode = OP_MODE_EXDED){
    unsigned char chan;
    int label;
    for (chan = 0;chan < 4;chan++){
    unsigned char channelUsed = 0;
    if (data_rate = data_rate = 12_u5;channellabel
    
    
    = 1);(channelu1 = 256) label++){
    if (AMT[CHA][label].txRate > 0 && AMT[CHA][label].txRateEnabled = 1){
    if (AMT[CHA][label].txRateSubtract = Delta、(AMT[CHA][AMT].txRateSubtract <
    
    
    
    SDI)&
    CHAN elued[SM].AMT.AMT[AM.AMT.AMT.AMT.AMT.AMT.AMT.AMT.AM]= AMT.AMT.AMT.AMT.AMT.AMT.AMT.AMT.AMT.AMT.AMT.AMP[AM]
    AM.奇 偶校验= AMT[CHA][label].invertParity;
    
    AMT[CHA][label].txRateSubtract = adiac[CHA][label].txRate;
    channelUsed++;
    
    unsigned long out = transformArincFromStruct(am);
    GPIOPinWrite (SOC_GPIO_3_regs、0x09、CHAN_ImxPIN
    、高电平); 输出);
    GPIOPinWrite (SOC_GPIO_3_regs、0x09、GPIO_PIN_LOW);
    }
    
    
    }
    }
    }if (option_mode!= OP_MODE_OFF){
    //激活 FIFO
    的轮询 Semaphore_post (sem);
    }
    
    
    void DebugUartist (UArg arg){=
    
    
    0xtt、
    UART0
    
    
    )、if tt = 0xtt (tt)、inct = 0xtt、incr (tt);(f)
    
    
    
    
    //确认
    中断;
    案例0x15:
    //not-achnarge;
    
    }
    if (eventCounter > 0){
    VisiGenieEvent[eventCounter - 1]= tmp;
    ++eventCounter;
    }
    if (eventCounter = 7){
    eventCounter = 0;
    handleVisiGenieEvent (VisiGeneEvent、uevistance);
    
    
    }uartdleVisen_imeEvent;uartsenueldle_imen&nessen&ness&ness&ness&ness&necess&nation&notr&nation
    //UARTCharGetNonBlocking ()
    
    /*int I;
    for (i=0;i<29;++I){
    if (ackn[i]=0){
    ackn[i]=tmp;
    }
    */
    }
    
    void common_main (){
    UILsSetBoardType (AM335X_Board_type_ice_V2)}{ackn[i]=tmp;}// void common_main_maixed/!/!/!inceed/!(
    
    
    
    如果需要)
    、则不使用!mux_en_en_enrate_enrate&/!/!/!/!/!/&mu_enrate_enrate&/!/!
    /* Regitser 退出处理程序-这将在调用 BIOS_exit 时执行*/
    System_atexit (exit_handler_app_restart);
    #endif
    //*寄存器毫秒延迟函数*/
    DELAYRegisterMSDelayfn ((void*) Task_sleep);
    
    #ifdef XIP_NOR
    Cache_lock (((ptr) 0x808000)
    
    
    
    
    ;0x48000C (CCRIT = 0x808000);0x808000) CCRUST_CCRUS_CK_08000 (0x808000);0x808000 (0x808000);0x48CCRK_CCRIT = 0x808000 (0x808000);0x808000 (0x801000 CCRK_CC_1000
    
    (0x808000);0x808000);0x801000 //将 GPIO2-26设置为启用或不访问128K 以上
    }
    
    cache_lock ((ptr) 0x08020000,0x8000);
    cache_wait ();
    cache_lock ((ptr) 0x080280000x8000);
    cache_wait ();
    cache_lock ((ptr) 0x08030000,0x8000);
    cache_wait();
    cache_lock ((ptr) 0x080380000x8000);
    cache_wait();
    #else
    cache_lock (ptr) 0x40300000、0x8000);
    cache_wait();
    cache_lock ((ptr) 0x40308000、0x8000);
    cache_wait();
    #ifndef EXEC_FROM IRAM
    cache_lock ((ptr) 0x8000000、0x8000);
    cache_wait();
    cache_lock (ptr) 0x80008000、0x8000);
    cache_wait();
    cache_lock ((ptr) 0x80010000、0x8000);
    cache_wait();
    cache_lock (ptr) 0x80018000、 0x8000);
    cache_wait();
    #endif #endif
    
    
    (AM335X_Board_type_IDK == boardType){
    PinMuxConfig (idkMux);
    // for Input reading - HVS*/
    McSPIInit (MCSPI_Instance_1、12、0、MCSPI_Single_CH、MCSPI_CH、MCSPI_Channel 1
    );}通道 否则、如果(AM335X_Board_TYPE_ICE_V2 = boardType){
    PinMuxConfig (iceMux);
    PinMuxConfig (ICE_v2Mux);
    
    // for Input reading - HVS*/
    McSPIInit (MCSPI_Instance_0、12、0、MCSPI_single_CH、MCSPI_ch_1、MCSPI_channel_ch_1);
    }} else{
    PinMuxConfig (iceMux);
    PinMuxConfig (ICE_v1Mux);
    
    // for Input reading - HVS*/
    McSPIInit (MCSPI_Instance_1、12、1、MCSPI_SINGLE_CH、MCSPI_CHANNEL 0);
    }
    Task_Params taskParamsEcat;
    Task_Params_init (&taskParamsEcat);
    taskParams.priority = 4;
    //taskParams.STACKSIZE = 1024;
    taskEcatHnd = Task_create (taskEthercat、 &taskParamsEcat、NULL);
    
    Task_Params taskParamsArinc;
    Task_Params_init (&taskParamsArinc);
    taskParamsArinc.priority = 14;
    //taskParams.STACKSIZE = 1024;
    taskArincHnd = Task_create (taskArinc、&taskParamsArinc、NULL);
    
    Task_Params paramsDisplay;
    Task_Params_init (&taskParamsDisplay);
    taskParamsDisplay.priority = 5;
    taskDisplayHnd = Task_create (taskDisplay、&taskParamsDisplay、NULL);
    
    if ((unsigned char) AM335X_Board_type_ice_V2 = boardType){
    uartInstance = 4;
    printf ("\r\n 调用 UartOpen...");
    UartOpen (uartInstance、DebugUartISR);
    }否则{
    printf ("\r\n 错误:错误的器件类型!"
    );UartOpen (uartInstance_Debug_GPIO_rgpio1);
    
    
    GPIO_degr0_inr_gpio_inr_output_gpio_r_gpio_r_r_rum_gpio_gpio_in_delimum_gpio
    
    #endif
    UTILsTimer2Init();
    
    if (AM335X_Board_type_IDK == boardType){
    UTILsPowerPWM ();
    }
    
    if (get_app_reload _FLAG ()!= 0xAA){
    enable_PRUSS_access_from_host ();
    pinILsResetPhys ();}if (get_app_reload
    
    = 0xUST_PRUST_IC0)= 0xUSCK_init/0xUSSIMPRx0;pinuS (0xUSSIMPUxSIMP_INUx0)= 0xUS_INUCC#(0xUS_INUCR/0xUS_INUCLUS_INUCR/0xUS_INUCR= 0xUSSIMPUCR
    
    
    // PRUSS 引脚多路复用
    }
    
    //禁用 PRU -这是为了确保在应用程序未初始化时 PRUSSDRVPrucDisable
    (0);
    PRUSSDRVPrucDisable (1);
    
    //确保 PRU_MEM 不会随机提供0xAA */
    SET_APP_LOAD_FLAG (0);
    // PRUSS_ACCESS_RELOAD (0);}
    
    
    #ifndef EXEC_FROM IRAM
    #ifndef NO_UART_MSG_APP
    /*
    跳过这些内容,因为我们不需要它。
    if (AM335X_Board_type_ICE = boardType)
    {
    uartInstance = 5;
    }
    否则(AM335X_Board_type_IDK = boardType)
    {
    uartInstance = 3;
    }
    否则(AM335X_Board_type_ICE_V2 =
    
    
    
    
    NULL 类型){uartInstance = 3;}uartInstance = 3;}if (AM335X_Board_type_ICE_ICE_INC
    
    
    
    
    = NULL =基本解决方法)*在电路板上执行#artiftisdif (uartif/disarmace*。
    if (WAIT_ITH_BOOT_Process){
    unsigned int maxIntB = 547483647;
    for (;maxIntB > 0;maxIntB--){
    
    }
    
    initHi3200 (0x1);
    
    Clock_Params clockParams;
    Clock_Handle myClock;
    
    Error_Block EB;
    SEM = Semaphore_create (0、 空、&EB);
    if (SEM =NULL){
    System_abort ("信标创建失败");
    }
    
    Error_init (&EB);
    Clock_Params_init (&clockParams);
    clockParams.period = Delta;
    clockParams.startFlag = true;
    clockParams.arg =(UARg) 0x5555;
    
    myClock = Clock_create (txRateHandler、Delta、&clockParams、&EB);
    if (myClock == NULL){
    System_abort ("时钟创建失败");
    }
    
    initArincUtils ();
    initEPUtils ();
    
    option_mode = OP_MODE_EXDED;
    
    clearAllAMT ();
    
    //printf ("\r\n 时钟 tickPeriod:%u"、Clock_tickPeriod);
    
    initDisplay (uartInstance);
    
    BIOS_start();
    }
    
    uint8 isEtherCATDevice (void){
    uint32 temp;
    
    temp =*((uint32*) 0x44E10604);
    
    if (((&
    
    
    
    1)& 1)(temp & 1) 1)(& 1)(& 1 & 1)返回)(1)< 1)(& 1)(温度和1 & 1)(1)< 1)(1)(1)& 1)(1)& 1)(返回1)< 1
    
    
    
    #if !defined (EXEC_FROM IRAM)&&!defined (XIP_NOT)
    //
    *运行时固件升级相关代码-仅支持此功能
    *截至目前为止在调试和发布版本上
    */
    extern void* app_reload _code_start;
    extern void * app_reload _code_size;
    extern void * app_reload _code_run;
    /*
    -将应用程序重新加载代码重定位到某个位置,以便将来的应用程序下载不会覆盖此代码。
    -这需要从主函数调用
    */
    void relocated_reload (){
    uint32 itr = 0;
    uint32 len =(uint32)&app_reload _code_size;
    uint32 * src =(uint32 *)&app_reload _code_start;
    uint32 * len =(uint32 *)&itr+
    
    
    
    =(uint32 *)<itr+);[itr+= it r+=(itr+);[itr+)<itr+}<itr+}<itr+(itr+)
    }
    #endif
    

     


    标头保存在 0x800404b8至0x80048d23范围内的存储器中。

    在迭代期间、上述代码将从0x800404b8覆盖到0x800412CF、itr = 302到1204。

    我还想提一下、"AM335x.cmd"被重写以访问更多存储器、更改如下所示

    部分

      init:{ boot*(.text)}> 0x8000000000 //*确保我们可以引导!            *
       组:加载> OCMC_SRAM
       {
           .bss:
       }   
       app_reload:{ities_apload.obj (.text)}load > DDR3、run > 0x80040000、align = 0x4
                 LOAD_START (APP_RELOAD_CODE_START)
                 RUN_START (APP_RELOAD_CODE_RUN)
                大小(APP_RELOAD_CODE_SIZE)
      .text:load >> DDR3 align = 0x8000

       .bss_DDR3:{ticescbsp.obj (.bss:EEPROM_cache)}> DDR3
       .cinit:加载> DDR3
       init_array:load > DDR3
       .const:load >> DDR3
       .fardata:load >> DDR3
       .switch:load >> DDR3
       .data:load >> DDR3
       .stack:load >> DDR3
       .sysmem:load > ddr3
       .far:load >> DDR3
       .args:load > DDR3 align = 0x4、fill = 0{_argsize = 0x0;}
       .cio:load >> DDR3
       TI.SYSBIOS.family.ARM.A8.mutableSection:Load >> SRAM_HI、type = NOINIT
       vecs:load > DDR3
       xdc.meta:load >> DDR3、type = copy
       tiesc.debugSection:> 0x80030000


     

    原来的是、

     

    部分

      init:{ boot*(.text)}> 0x8000000000 //*确保我们可以引导!            *
       组:加载> OCMC_SRAM
       {
           .bss:
           .data:
           .stack:
       }   
       app_reload:{-lsys_BIOS_driver.lib (.text)、-lam335x_platform.lib (.text)、tables_apload.obj (.text)}load > DDR3、run > 0x80040000、align = 0x4
                 LOAD_START (APP_RELOAD_CODE_START)
                 RUN_START (APP_RELOAD_CODE_RUN)
                大小(APP_RELOAD_CODE_SIZE)
      .text:load >> DDR3 align = 0x8000

       .bss_DDR3:{ticescbsp.obj (.bss:EEPROM_cache)}> DDR3
       .cinit:加载> DDR3
       init_array:load > DDR3
       .const:load >> DDR3
       .fardata:load >> DDR3
       .switch:load >> DDR3
       .sysmem:load > ddr3
       .far:load >> DDR3
       .args:load > DDR3 align = 0x4、fill = 0{_argsize = 0x0;}
       .cio:load >> DDR3
       TI.SYSBIOS.family.ARM.A8.mutableSection:Load >> SRAM_HI、type = NOINIT
       vecs:load > DDR3
       xdc.meta:load >> DDR3、type = copy
       tiesc.debugSection:> 0x80030000


     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bhavanithya thiraviaraja65 说:
    代码文件中覆盖(函数  relocated_reload _code ())的部分代码如下所示

    我认为问题是链接器命令文件具有以下内容[vanuser="Bhavanobj ithya thiraraja65"]   .app_reload = 0x400c、rapp_prue_prue_rande = 0x400、rapp_prue_rapp_pru.c = 0x400、rapp_pru.prue_prue_prue_rande = 0x400、rapp.
                 LOAD_START (APP_RELOAD_CODE_START)
                 RUN_START (APP_RELOAD_CODE_RUN)
                size (app_reload、code_size)这会将.app_reload 代码段的运行地址放置在0x80040000的固定起始地址、 链接器还会将一些应用数据放置在 DDR3存储器区域中的同一地址。

    我可以就如何更改链接器命令文件提出一些建议 、以防止.app_reload 代码段和应用程序数据被分配到同一地址。 但是、我不知道原始链接器命令文件为什么使用固定地址 0x80040000。

    由于这是基于示例 EtherCAT 软件的链接器命令文件中的一个问题、因此建议您在 Sitara 处理器论坛上创建一个新线程

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    切斯特、

    当然,我会这样做!

    感谢你的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    切斯特、您好!

    我尝试在链接器通信文件中将0x8004000更改为0x8005000、但未存储应用程序数据。 因此不会覆盖、问题现已解决!

    感谢您的参与。 )