Инструменты пользователя

Инструменты сайта


ob:o7:debug

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
ob:o7:debug [2016/09/08 06:02]
иван_денисов [Отладка программ на языке Оберон-07]
ob:o7:debug [2018/05/26 07:01]
иван_денисов [Сторожевой таймер]
Строка 59: Строка 59:
  
  
-===== Пример =====+===== Пример отладчика =====
  
 +Чтобы осуществлять отладку микроконтроллера необходимо обмениваться сообщениями. Более подробно организация обмена описана в заметке [[ob:o7:trimble|Обмен сообщениями с контроллером]].
  
 <code>MODULE MobxAssert; <code>MODULE MobxAssert;
Строка 67: Строка 68:
  Traps := MicroARMv7MTraps,  Traps := MicroARMv7MTraps,
  Sys := MicroSTM32F103x8System,  Sys := MicroSTM32F103x8System,
- TPs := MicroSTM32F103x8TPorts;+ Pins := MicroSTM32F10xPinCfg, 
 + TPs := MicroSTM32F1TPorts;
  
  CONST  CONST
Строка 89: Строка 91:
  
  PROCEDURE Init;  PROCEDURE Init;
- VAR ok: BOOLEAN;+ VAR ok: BOOLEAN; par: TPs.InitPar;
  BEGIN  BEGIN
- TPs.Init(p0, TPs.USART119200TPs.parityNoneReceive);+ par.n := TPs.USART1
 + par.RXPinPort := Pins.A; par.RXPinN := 10; 
 + par.TXPinPort := Pins.A; par.TXPinN := 9; 
 + par.UCLK := Sys.PCLK2; 
 + par.baud := 19200
 + par.parity := TPs.parityNone
 + par.receive := Receive
 + par.version2 := 2; 
 + TPs.Init(p0, par); 
 +
  TPs.Send(p0, idInit, 0, 0, ok); (* required for "heating" UART *)  TPs.Send(p0, idInit, 0, 0, ok); (* required for "heating" UART *)
  IF Traps.trapFlag THEN  IF Traps.trapFlag THEN
Строка 108: Строка 119:
  
 В журнал будет выведена информация о модулях. В журнал будет выведена информация о модулях.
-<code>OARMv7MLinker 3.6.2016 +<code>linking MobxAssert Ok
-linking MobxAssert Ok+
  MicroARMv7M 256  MicroARMv7M 256
- MicroKernel0 264 + MicroKernel0 301 
- MicroARMv7MTraps 950 + MicroARMv7MTraps 987 
- MicroSTM32F10xxD 1224 + MicroSTM32F10xxD 1283 
- MicroSTM32F103x8System 1227 + MicroSTM32F103x8System 1286 
- MicroSTM32F10xPinCfg 1476 + MicroSTM32F10xPinCfg 1535 
- MicroSTM32F103x8TPorts 1603 + MicroSTM32F1TPorts 1662 
- MobxAssert 3019 + MobxAssert 3146 
-ROM: 6384 B; RAM: 508 B</code>+ROM: 6816 B; RAM: 748 B 
 +</code>
  
  
Строка 136: Строка 147:
  p: TP.Port;  p: TP.Port;
  mh: MessagesHandler;  mh: MessagesHandler;
- В подсистеме Micro есть удобный инструмент для организации обмена сообщениями между контроллером и компьютером. 
- 
-На Linux удобно установить права доступа к COM-портам: 
- 
-sudo usermod -a -G dialout $USER 
- 
-Чтобы в Wine работать с COM-портами, необходимо сделать ссылки на них. Если вы работаете с USB-переходниками, то команды будут следующие: 
- 
  
  PROCEDURE Send*(t: INTEGER);  PROCEDURE Send*(t: INTEGER);
Строка 188: Строка 191:
 <code>^Q "MobxDebug.Open('COM1')"</code> <code>^Q "MobxDebug.Open('COM1')"</code>
  
-For Linux+Для Linux будет следующая команда:
 <code>^Q "MobxDebug.Open('/dev/ttyUSB0')"</code> <code>^Q "MobxDebug.Open('/dev/ttyUSB0')"</code>
  
Строка 195: Строка 198:
  
 В журнал Блэкбокса будет выведена информация: В журнал Блэкбокса будет выведена информация:
-<code>pc:  3028 +<code>pc:  3155 
-pos:  309+pos:  337
 code:  7</code> code:  7</code>
  
-Program Counter (pc) равен 3028, что больше 3019 (см. информацию при сборке), а значит аварийная остановка произошла в модуле MobxAssert в положении 309 с кодом 7.+Program Counter (pc) равен 3155, что больше 3146 (см. информацию при сборке), а значит аварийная остановка произошла в модуле MobxAssert в положении 337 с кодом 7.
  
 Чтобы перейти к положению ошибки в модуле, удобно воспользоваться инструментом **O7->Position**. Чтобы перейти к положению ошибки в модуле, удобно воспользоваться инструментом **O7->Position**.
 +
 +
 +===== Сторожевой таймер =====
 +
 +Чтобы определить, когда микроконтроллер «завис» в бесконечном цикле, полезным инструментом является сторожевой таймер **MicroARMv7MSTM32F4WWDG** ([[https://github.com/aixp/O7/blob/master/Micro/Files/STM32F4IWDG.odc|github]]).
 +
 +Чтобы его использовать, сначала необходимо выполнить процедуру **Init**, и затем периодически вызывать процедуру **Update**. Тогда, при «зависании» микроконтроллера сработает **аварийная остановка с кодом 20**, и возможно определить место в программе, где это произошло (**Traps.trap.pc**)
 +
 +Более универсальный сторожевой таймер не имеет возможности определения места остановки: **MicroSTM32FxIWDG** ([[https://github.com/aixp/O7/blob/master/Micro/Files/STM32FxIWDG.odc|github]]). Но зато он работает на любых типах микроконтроллеров моделей STM32F.
 +
 +
 +----
 +
 +Авторы заметки: [[http://iadenisov.ru|И. А. Денисов]], А. В. Ширяев
  
ob/o7/debug.txt · Последнее изменение: 2024/05/08 12:58 — iadenisov