потерять адрес указателя при вызове Timer_callback ON STM32 - PullRequest
0 голосов
/ 08 июля 2019

Я работаю с STM32F103 и у меня возникают проблемы при вызове timer_callback.Я работаю над CANopen_node и внес некоторые изменения в стек, потому что я работаю с HAL.Когда я инициализирую модуль CAN, используя структуры с функцией типа CO_init (CAN_HandleTypeDef CANbaseAddress,uint8_t nodeId, uint16_t bitRate), все идет хорошо.Но когда я включаю и запускаю прерывание от таймера, я теряю все, что есть у инициализации модуля CAN.

Кто-нибудь знает, почему я теряю значения моего модуля CAN при выполнении обратного вызова;код:

COO is static variable.
 in COO variable 

    typedef struct{
        CO_CANmodule_t     *CANmodule[1];   /**< CAN module objects */
        CO_SDO_t           *SDO[CO_NO_SDO_SERVER]; /**< SDO object */
        CO_EM_t            *em;             /**< Emergency report object */
        CO_EMpr_t          *emPr;           /**< Emergency process object */
        CO_NMT_t           *NMT;            /**< NMT object */
        CO_SYNC_t          *SYNC;           /**< SYNC object */
        CO_RPDO_t          *RPDO[CO_NO_RPDO];/**< RPDO objects */
        CO_TPDO_t          *TPDO[CO_NO_TPDO];/**< TPDO objects */
        CO_HBconsumer_t    *HBcons;         /**<  Heartbeat consumer object*/
    #if CO_NO_SDO_CLIENT == 1
        CO_SDOclient_t     *SDOclient;      /**< SDO client object */
    #endif
    #if CO_NO_TRACE > 0
        CO_trace_t         *trace[CO_NO_TRACE]; /**< Trace object for monitoring variables */
    #endif
    }CO_t;
    CO_t *CO = NULL;

хорошая инициализация до обратного вызова good init befor callback

после обратного вызова after callback

1 Ответ

1 голос
/ 08 июля 2019

Если ваш MCU имеет только 20 кБайт ОЗУ, как STM32F103C8 «Синяя таблетка», то значение CANbaseAddress, 0x20004FC0 перед вызовом, подозрительно близко к концу ОЗУ на 0x20005000.

Скорее всего, она объявлена ​​как локальная переменная в функции, которая уже завершила работу, память, выделенная для этой структуры (в стеке), освобождается и используется для чего-то другого.

Объявите структуру как static, когда вам понадобится ее значение позже через указатель.

...