Comportamiento del depurador JTAG de Atmel Studio

2

La qeustion:

Me gustaría saber qué hay de diferente en la forma en que JTAG trata los comandos "paso a paso" y "paso a paso".

Background:

Estoy tratando de establecer un bit GPNVM en un chip SAM3N (ARM Cortex M3) utilizando la función de programación en la aplicación (IAP) en la ROM.

El código llama a efc_perform_command(EFC, EFC_FCMD_CGPB, 1); , que es una función en el marco de software de Atmel.

En esencia, su código se ve así (después de eliminar toda la macro magia):

uint32_t efc_perform_command(Efc *p_efc, uint32_t ul_command, uint32_t ul_argument)
{
    static uint32_t(*iap_perform_command) (uint32_t, uint32_t);

    iap_perform_command = (uint32_t(*)(uint32_t, uint32_t)) *((uint32_t *) CHIP_FLASH_IAP_ADDRESS);

    iap_perform_command(0, EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(ul_argument) | EEFC_FCR_FCMD(ul_command));

    return (p_efc->EEFC_FSR & EEFC_ERROR_FLAGS);
}

Si desea ver su código completo, puede consultar su referencia aquí y fuente completa aquí .

Sigue el proceso recomendado en la hoja de datos (sección 20.5.3 En Programación de aplicaciones (IAP ) Característica ) correctamente por lo que puedo ver.

Cuando estoy depurando el código a través de JTAG paso a través de esta función. Si paso por él con F10 (Paso a paso), o si simplemente intento ejecutar el código, se rompe y termina ejecutándose desde la ubicación de memoria 0x00000000.

Sin embargo, si estoy depurando el código y paso a utilizar F11 (Step Into), el código funciona de la forma que esperaría.

Esto me sugiere que hay algo extraño en mi registro de enlaces ... Aunque quisiera que este problema se resolviera, esta pregunta se refiere al comportamiento de Atmel Studio. Me gustaría saber qué tiene de diferente la forma en que JTAG trata los comandos "paso a paso" y "paso a paso".

Edición 1:

El problema se resolvió y parece haber sido causado por la interrupción de la señal FreeRTOS. Desde que estuve modificando flash, el requisito de que no debo ejecutar se mantiene. Parece que estaba modificando el Registro de pila de alguna manera o ejecutando una rutina de interrupción (en flash) causando que entrara en un estado no válido. Aunque esto explica un poco sobre lo que podría estar sucediendo, todavía hay dos opciones:

  1. El depurador desactiva la interrupción de SysTick (o interrupciones en general) cuando usa F11 (Step Into), pero les permite ejecutar con F10 (Step Over).
  2. El depurador intenta ingresar el código, se da cuenta de que no puede y luego manipula el registro de enlaces, de alguna manera, para volver a la siguiente línea.

Sospecho que 2 es poco probable y que 1 es la respuesta aquí, pero me gustaría que alguien que lo sepa como un hecho lo confirme por mí.

    
pregunta nonsensickle

0 respuestas

Lea otras preguntas en las etiquetas