Отговори на тема  [ 11 мнения ] 
Exception handling (Cortex) 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Exception handling (Cortex)
Да питам вие как го правите... Въпроса е по-скоро от принципен характер: какво е разумно и смислено да се направи, след като процесора е стигнал до ексепшън... Кортекса специално има 4 такива.


Чет Сеп 16, 2010 3:21 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 3:25 pm
Мнения: 5677
Местоположение: София
Мнение 
Малко спам :oops:

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

try:
...
except:
...

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

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


Чет Сеп 16, 2010 7:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
за дебъг версия примерно това го слагаш и на 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..." и след време/клавиш рестартирам в нормален режим...


Чет Сеп 16, 2010 8:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ами аз като Миро.

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

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

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Сеп 17, 2010 11:22 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Аз си имам една област във външна памет, където си правя лог на изцепшъните: кога, къде, регистри и т.н. От време на време девайсите рапортуват "как вървят нещата". Ако се наложи, правя нова ревизия на фърмуера.


Пет Сеп 17, 2010 11:36 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
Между другото с куртекса имам един проблем дето още не съм му измислил решение...

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


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


Пет Сеп 17, 2010 12:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Абе не съм сигурен как беше ама на ST имаше механизъм за това. Ама не беше в ядрото, а в периферията, нещо (регистър, бит) беше с еднозначна стойност при студен ресет. Незнам дали не беше вързано с вградения RTCC....

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Сеп 17, 2010 12:45 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
има един регистър ама той е достъпен само отвън през JTAG-TAP-a... за друг стандартен дето да става не знам
Иначе OCD ли беше... някъде гледах, че рестартират като разлаят кучето. Като ми остане време ще се поровя за по-малко тъпо решение (ако има)....


Пет Сеп 17, 2010 1:04 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

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


Пет Сеп 17, 2010 1:49 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
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 ;-)


Пет Сеп 17, 2010 2:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение 
Аз като батето ползвам външната памет за логове, а рестартирам луминарито с SysCtlReset() - това обикновенно го правя след ъпдейт на фърмуера, за да се върне от бутлодера обратно в основната програма ресетнат. Не съм забелязъл да съм имал някакви грижи :) .


Пет Сеп 17, 2010 2:54 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 11 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни