Перейти к содержанию
    

Только что, Arlleex сказал:

А есть еще неточный

Сам сегодня искал. Но с чего-то начинать-то надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пишет No source available for "slaveRxBuf() at 0x20000716"

не понимаю при чем тут эта переменная я же просто инициализирую UART. кстати в IAR-е компилируется и работает

может дело в этом?

image.png.814d9f76b7d43c4183cd4ba2cfd480c6.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 минут назад, RusikOk сказал:

может дело в этом?

Да все эти инструкции представляют собой какой-то бессмысленный набор. Это вообще адреса ОЗУ, как туда исполнение попало и почему отладчик думает, что там должен быть код функции slaveRxBuf()? А если он там должен быть - почему его там нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня нет такой функции. есть массив trace_t        slaveRxBuf[2008];

я вообще не понимаю в чем там проблема. тот же самый код в ИАРе идеально работает. стек и кучу увеличивал не помогло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, RusikOk сказал:

пишет No source available for "slaveRxBuf() at 0x20000716"

не понимаю при чем тут эта переменная я же просто инициализирую UART.

Очевидно в какой-то момент у вас управление улетает в область данных и данные начинают исполняться как код. Который здесь виден. А HF возникает на команде записи в память, потому как в R0 в этот момент - адрес недопустимый для записи (не ОЗУ там). А переменная не при чём. Как и HF - он вторичен, баг в другом месте, вполне возможно - никак не связанном с slaveRxBuf.

Ставьте бряк чуть раньше (на 20000714) и шагайте по функциям от старта ПО. Пока бряк не сработает. Потом внутрь функции, на которой это случилось и опять шагать до бряка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, jcxz said:

и опять шагать до бряка

Ещё учти, что бряк может быть не в функции.

Я тут недавно народ напрягал вопросом про отладку, так у меня в итоге причиной бряка оказалось то, что в таблице адресов с векторами прерываний не хватало нолика на месте отсутствующего вектора, поэтому вся таблица съехала, а проц при уходе на обработку прерывания уходил на нулевой адрес. Так что шагай отладчиком и смотри, когда и куда ты улетаешь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дебагер выплюнул такую строчку set *(int *)0xE000EDFC=*(int *)0xE000EDFC|0x400

в *.map и *.list такого адреса переменной не нашел. как узнать название переменной по ее адресу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, RusikOk сказал:

при старте сразу же в hard fault

при старте отладки или старте с main()?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, RusikOk сказал:

у меня нет такой функции. есть массив

Я не телепат - вы написали "slaveRxBuf()", а скобки тут означают функцию.

8 минут назад, RusikOk сказал:

дебагер выплюнул такую строчку

Куда выплюнул? Когда выплюнул? Как выплюнул? Это адрес какого-то регистра, а адреса регистров у разных семейств отличаются. Но вы даже не написали, какой контроллер вы отлаживаете, если это викторина - огласите приз победителю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, RusikOk сказал:

дебагер выплюнул такую строчку set *(int *)0xE000EDFC=*(int *)0xE000EDFC|0x400

в *.map и *.list такого адреса переменной не нашел. как узнать название переменной по ее адресу?

Та строчка всего лишь говорит о том, что отладчик будет перехватывать все Fault-ы, т.е. при HF, например, возникнет событие отладки и CPU остановится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, razrab83 сказал:

при старте отладки или старте с main()?

Setting breakpoint @ address 0x080007AA, Size = 2, BPHandle = 0x0001
Setting breakpoint @ address 0x08005268, Size = 2, BPHandle = 0x0002
Starting target CPU...
...Target halted (Vector catch, PC = 0x08001000)
Reading all registers
Removing breakpoint @ address 0x080007AA, Size = 2
Removing breakpoint @ address 0x08005268, Size = 2
Read 4 bytes @ address 0x08001000 (Data = 0xB082B580)
Read 4 bytes @ address 0x20000754 (Data = 0xA1000000)
Reading 64 bytes @ address 0x20000740
Read 4 bytes @ address 0x20002174 (Data = 0xD486CFB8)
Reading 64 bytes @ address 0x20002140
Read 4 bytes @ address 0x20000340 (Data = 0x00000000)
Reading 64 bytes @ address 0x200001C0
Reading 64 bytes @ address 0x20000200
Read 4 bytes @ address 0x20000340 (Data = 0x00000000)

при старте ядра

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, Сергей Борщ сказал:

не написали, какой контроллер вы отлаживаете

stm32g0xx

4 минуты назад, RusikOk сказал:

при старте ядра

не понятно, что такое старт ядра? в настройках отладки можно поставить брейкпоинт на main() сделать "run to" и дописать main() или любую др функцию. по умолчанию стоит брейк на мэйне.

вы стартуете отладку (не ядро, а в иде запускаете отладчик), запускаются всякие gdb, заливка кода, старт кода (если есть run to) и код выполняется до main(). останавливается на main(). Далее делаете Run и начинается выполнение маин, которое вызывает инит вашей перифирии, например инит вашего уарта. и вот в это ините возникает HF?

 

Стартом ядра вы называете запуск исполнения программы с самого начала?

Если у вас инит уарат до маина, перенесите инит уарта в тело майна и там нормально прошагайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, razrab83 сказал:

не понятно, что такое старт ядра? в настройках отладки можно поставить брейкпоинт на main() сделать "run to" и дописать main() или любую др функцию. по умолчанию стоит брейк на мэйне.

Starting target CPU...
...Target halted (Vector catch, PC = 0x08001000)

 

всем спасибо! вопрос решился заменой программатора. это вообще нормально? в IAR работает тут нет. я даже комп перезагружал. еще один повод удалить эту индусскую поделку нафиг

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, tonyk_av сказал:

Ещё учти, что бряк может быть не в функции.

бряк == breakpoint

О чём вы пишете - совершенно не понятно... :wacko2:

2 часа назад, RusikOk сказал:

дебагер выплюнул такую строчку set *(int *)0xE000EDFC=*(int *)0xE000EDFC|0x400

в *.map и *.list такого адреса переменной не нашел. как узнать название переменной по ее адресу?

Открыть мануал на ядро и посмотреть какой регистр занимает этот адрес.

И вообще - отучаться от использования "магических чисел" в исходнике. Тем более - обращений к памяти таким образом. Чтобы не возникало подобных вопросов.

 

PS: И кстати - обращение к регистрам периферии очень желательно выполнять с модификатором volatile. Чтобы на другие грабли позже на наступить.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...