Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Exception handling (Cortex)
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8126
Страница 1 от 1

Автор:  setoy [ Чет Сеп 16, 2010 3:21 pm ]
Заглавие:  Exception handling (Cortex)

Да питам вие как го правите... Въпроса е по-скоро от принципен характер: какво е разумно и смислено да се направи, след като процесора е стигнал до ексепшън... Кортекса специално има 4 такива.

Автор:  Desert Leo [ Чет Сеп 16, 2010 7:54 pm ]
Заглавие: 

Малко спам :oops:

Като ти гледам аватара

try:
...
except:
...

ли търсиш? :oops:

Питона е върха!!!

Автор:  miro_atc [ Чет Сеп 16, 2010 8:18 pm ]
Заглавие: 

за дебъг версия примерно това го слагаш и на 4-те:
Код:
extern "C" void HardFaultIsr(void)
{
    unsigned status = SCB->CFSR;
    unsigned int i=1;
    TRACELN("\r\nException ");
    if(status&0xFF)
       TRACELN("MPU: %2.2x at %x ", status&0xFF, SCB->MMFAR );
    if(status&0xFF00)
       TRACELN("BUS: %2.2x at %x ", (status&0xFF00)>>8, SCB->BFAR);
    if(status&0xFFFF0000)
       TRACELN("USAGE: %4.4x",(status&0xFFFF0000)>>16);
    SCB->CFSR = status;
    while(i){}
}


всъщност при читав дебъгер и празна функция е достатъчна. тая е в случай, че не спира самичко... Тъй де, независимо дали ти ще го спреш или то ще спре, променяш от дебъгера i=0 и то като излезе се връща от мястото дето е направило гафа. Гледаш и откриваш проблема ;-)

В релийз версията вече зависи от устройството. Аз имам дисплей, тъй че рестартирам (за да съм сигурен, че дисплея е ОК) в специален режим, изписвам на екрана едно "oops..." и след време/клавиш рестартирам в нормален режим...

Автор:  Цецо [ Пет Сеп 17, 2010 11:22 am ]
Заглавие: 

Ами аз като Миро.

Обикновенно в дебъг прихващам всички ексепшъни, завъртам ги в for( ;; ). И после като се завре вътре почвам да псувам и да си тормозя мозъчните гънки :)

Иначе в релис - ако имаш дисплей - ясно. Ако не, все някой светодиод да мига с кода на грешката. Всъщност то в релиз версията е гадно, щото обикновенно клиента е тоя дето вижда проблема, та както и да го индицираш - все тая. Какво е разумно да се прави - зависи от приложението.

Автор:  bateAz [ Пет Сеп 17, 2010 11:36 am ]
Заглавие: 

Аз си имам една област във външна памет, където си правя лог на изцепшъните: кога, къде, регистри и т.н. От време на време девайсите рапортуват "как вървят нещата". Ако се наложи, правя нова ревизия на фърмуера.

Автор:  miro_atc [ Пет Сеп 17, 2010 12:22 pm ]
Заглавие: 

Между другото с куртекса имам един проблем дето още не съм му измислил решение...

При ARM7 първото нещо в ресет вектора е да сетна една променлива че е cold reset, а като стане фал сетвам променливата на "горещ" рестарт и го пускам след инициализацията в ресет вектора.
После по стойността на променливата знам дали е нормален рестарт или е имало гаф, който да покажа...


При куртекса обаче няма или поне аз не знам читав вариант да се "рестартира". Проблемът е в стека на ексепшъните, който е недостъпен и няма как да се изчисти. А ако не го изчистиш при първото прекъсване с по-нисък приоритет гърми. Ех има варианти да го ресетна напълно, ама тогава винаги тръгва от началото на ресет вектора и става трудно да разбера дали ресета е топъл или студен....

Автор:  Цецо [ Пет Сеп 17, 2010 12:45 pm ]
Заглавие: 

Абе не съм сигурен как беше ама на ST имаше механизъм за това. Ама не беше в ядрото, а в периферията, нещо (регистър, бит) беше с еднозначна стойност при студен ресет. Незнам дали не беше вързано с вградения RTCC....

Автор:  miro_atc [ Пет Сеп 17, 2010 1:04 pm ]
Заглавие: 

има един регистър ама той е достъпен само отвън през JTAG-TAP-a... за друг стандартен дето да става не знам
Иначе OCD ли беше... някъде гледах, че рестартират като разлаят кучето. Като ми остане време ще се поровя за по-малко тъпо решение (ако има)....

Автор:  setoy [ Пет Сеп 17, 2010 1:49 pm ]
Заглавие: 

Що беее.... нали ползваш Луминари ? Там има SysCtlReset() и SysCtlResetCauseGet() . Това в driverlib/sysctl . Не върши ли работа ?
Иначе, за изцепките (exceptions :D ) и аз си мислех нещо подобно... най ми допада варианта да се прави лог, макар че какво ли ще помогне за дебъгване не е ясно, но все пак по-добре да го има май... А това SCB->CFSR къде е обявено ? Сигурно е някой от регистрите на ядрото ? Ядрото не го познавам въобще... :oops:

Автор:  miro_atc [ Пет Сеп 17, 2010 2:10 pm ]
Заглавие: 

SysCtlReset() май ще свърши работа.... Не съм го видял щото не ползвам никакви чужди библиотечки (особено пък на Луминари заради гадния им лиценз) :oops:

Иначе от ARM.com съм взел CMSIS и съм го портнал до Ц++ класове. А SCB e System Control Block, т.е.:

Код:
/** @addtogroup CMSIS_CM3_SCB CMSIS CM3 SCB
  memory mapped structure for System Control Block (SCB)
  @{
*/
struct SCB_Type
{
  __I  uint32_t CPUID;                        /*!< Offset: 0x00  CPU ID Base Register                                  */
  __IO uint32_t ICSR;                         /*!< Offset: 0x04  Interrupt Control State Register                      */
  __IO uint32_t VTOR;                         /*!< Offset: 0x08  Vector Table Offset Register                          */
  __IO uint32_t AIRCR;                        /*!< Offset: 0x0C  Application Interrupt / Reset Control Register        */
  __IO uint32_t SCR;                          /*!< Offset: 0x10  System Control Register                               */
  __IO uint32_t CCR;                          /*!< Offset: 0x14  Configuration Control Register                        */
  __IO uint8_t  SHP[12];                      /*!< Offset: 0x18  System Handlers Priority Registers (4-7, 8-11, 12-15) */
  __IO uint32_t SHCSR;                        /*!< Offset: 0x24  System Handler Control and State Register             */
  __IO uint32_t CFSR;                         /*!< Offset: 0x28  Configurable Fault Status Register                    */
  __IO uint32_t HFSR;                         /*!< Offset: 0x2C  Hard Fault Status Register                            */
  __IO uint32_t DFSR;                         /*!< Offset: 0x30  Debug Fault Status Register                           */
  __IO uint32_t MMFAR;                        /*!< Offset: 0x34  Mem Manage Address Register                           */
  __IO uint32_t BFAR;                         /*!< Offset: 0x38  Bus Fault Address Register                            */
  __IO uint32_t AFSR;                         /*!< Offset: 0x3C  Auxiliary Fault Status Register                       */
  __I  uint32_t PFR[2];                       /*!< Offset: 0x40  Processor Feature Register                            */
  __I  uint32_t DFR;                          /*!< Offset: 0x48  Debug Feature Register                                */
  __I  uint32_t ADR;                          /*!< Offset: 0x4C  Auxiliary Feature Register                            */
  __I  uint32_t MMFR[4];                      /*!< Offset: 0x50  Memory Model Feature Register                         */
  __I  uint32_t ISAR[5];                      /*!< Offset: 0x60  ISA Feature Register                                  */


  void NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
  uint32_t NVIC_GetPriorityGrouping(void);
  void SysCtlReset(void);
  void SysCtlDeepSleep(void);
};

#define SCB                 ((SCB_Type *)           SCB_BASE)         /*!< SCB configuration struct          */



идеята е, че Ц++ е по-прегледно, а и като напишеш SCB-> ти излизат всички полета и всички функции... няма нужда да помниш, та и затова не съм запомнил че има SysCtlReset ;-)

Автор:  Dimitar [ Пет Сеп 17, 2010 2:54 pm ]
Заглавие: 

Аз като батето ползвам външната памет за логове, а рестартирам луминарито с SysCtlReset() - това обикновенно го правя след ъпдейт на фърмуера, за да се върне от бутлодера обратно в основната програма ресетнат. Не съм забелязъл да съм имал някакви грижи :) .

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/