|
|
  |
Прошу помощи с STM32F051, Периодическое сваливание в HardFault |
|
|
|
Aug 18 2014, 12:31
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Сергей Борщ @ Aug 18 2014, 11:56)  Почему вы упорно валите с больной головы на здоровую? Я не валю, тем более упорно. Я подцепил вброс Golikov A. (перенос библиотек), который простекает из двух основных проблем программирования: нельзя видеть будущее (и написать библиотеку на все случаи жизни), и нужно обеспечивать совместимость с предыдущей версией. Это хорошо проснуться десятилетием позже и охватить все варианты мудрым взором. Но Вы ведь помните, что сначала был M3, а лишь много позже ARM замутил M0, который вдруг не понимает отрицательных смещений и невыровненного доступа. И куда податься крестьянину? Ответ: перепахать огород. Я, кстати, совершенно с Вами согласен, что строгое программирование (в обсуждаемом случае __packed) может избавить от косяков. Но только честно: пусть в нас кинет камень тот, чей код соответствует MISRA. Цитата То есть вас удивляет, что ассемблерный код для одного ядра не ассемблируется для другого??? А почему вас тогда не удивляет, что код для Пентиума не ассемблируется под 8086? Простите, но это напоминает анекдот: - У меня на телефоне фотографии нечеткими получаются. - Да ладно? Прикинь, а у меня с фотоаппарата вообще звонить нельзя! По поводу 8086 и Пентиума - я изложил в первом абзаце. Если пофилосовствовать же, то меня ничто не удивляет в мире диалектики. Ясно одно: чтобы понять настоящее, надо знать предысторию. Правда, один немецкий филосов сказал, что главный урок состоит истории в том, что никто не извлекает из нее уроков. Кстати, Ваш анекдот в части телефона никто бы не понял еще лет 20 назад. На Ваш анекдот отвечу другим: - Почему Богу удалось создать мир всего да 6 дней? - Не нужно было обеспечивать совместимость с предыдущей версией.
|
|
|
|
|
Aug 18 2014, 13:13
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (KnightIgor @ Aug 18 2014, 16:31)  Я не валю, тем более упорно. Я подцепил вброс Golikov A. (перенос библиотек), который простекает из двух основных проблем программирования: нельзя видеть будущее (и написать библиотеку на все случаи жизни), и нужно обеспечивать совместимость с предыдущей версией. Написать вполне можно. Достаточно следовать простым правилам. В данном случае нарушено простенькое правило: нельзя приводить указатель от меньшего типа к большему. Из указателя на int делать указатель на char можно. А наоборот - нельзя. QUOTE (KnightIgor @ Aug 18 2014, 16:31)  Но Вы ведь помните, что сначала был M3, а лишь много позже ARM замутил M0, который вдруг не понимает отрицательных смещений и невыровненного доступа. До Cortex-M3 был ARM7TDMI. Вполне логично ожидать, что ассемблерный код для одной архитектуры не будет переносим на другую архитектуру. На то он и ассемблерный код.
|
|
|
|
|
Aug 18 2014, 14:45
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(LightElf @ Aug 18 2014, 15:13)  До Cortex-M3 был ARM7TDMI. Вполне логично ожидать, что ассемблерный код для одной архитектуры не будет переносим на другую архитектуру. На то он и ассемблерный код. "Логично ожидать?" Тогда вопросы. Когда был ARM7TDMI, было уже известно, что будет Cortex-M3? Когда появился Cortex-M3, и инструкция с отрицательным смещением была допустима, было известно, что появится M0? Если ARM приводит в 2009 пример для Cortex-M3, а именно на ассемблере (речь идет о SVC, и ARM прямо говорит, что без ассемблерной вставки никак), можно ли верить ARM и использовать код? Что будем делать с time_t после 19.01.2038?
|
|
|
|
|
Aug 18 2014, 16:31
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Сергей Борщ @ Aug 18 2014, 17:09)  Использовать для Cortex-M3 - можно. Этот же код для Cortex-M0 - чаще всего нет. Сергей, Вы правы. В 2014 году. Для 2009-2010 высказывание смысла не имеет. Как никто бы лет 20 назад не понял, почему смешно, что телефон фотографировать может, а фотоаппарат не может звонить. Кстати, уже и фотоаппарат почти может, коль WiFi в нем уже есть. А лет 30 назад никто бы не понял фразу: "забыл трубу дома". Подумали бы, что музыкант. П.С. Не удержусь, расскажу случай с собственным ребенком в садике. Дело было 2 года назад. В стране, где я живу, в саду проводят тесты, насколько хорошо дети владеют языком, чтобы вовремя отправить к логопеду, например, или позаниматься дополнительно в группе. Для этого им показывают картинки, просят назвать предмет, эмоции лица, и т.п. Родители могут молча присутствовать. И вот показывают моему мальцу картинку, на которой изображено что-то закругленно кубическое, красное, с кругом посередине и точками. Он смотрит долго, хмыкает и говорит: "божья коровка". Тетка начинает ставить наводящие вопросы. Реакция та же - жук, и все. Тогда тетка раскрывает ребенку глаза на этот удивительный мир и утверждает, что изображен телефон (для меня было очевидно: телефон с тубкой сверху, наборной диск с дырочками). На что мой малец говорит: "это не телефон, телефон - с кнопочками и картинкой". Вот так. Что скажут его дети на нынешние смартфоны, имея вживленные сети с приемом прямо в мозг?
Сообщение отредактировал KnightIgor - Aug 18 2014, 16:49
|
|
|
|
|
Aug 19 2014, 03:16
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(Golikov A. @ Aug 18 2014, 15:39)  получается лучше все указатели что void* передавать как указатели на пакованный тип? А лучше вообще все так передавать? Получается (с), что в голове у программера надо навести порядок. Что программеру предоставлен такой инструмент, как типизация. Что этот инструмент помогает избежать ошибок. Что используя void, программер отказывается от этого инструмента, а значит, всю ответственность, по части контроля за ошибками, программер берет на себя. Из чего следует, что очень желательно избегать void, где это только возможно. А если по каким-то причинам пришлось отказаться от типизации, то худшее место, где это можно сделать - "пограничная застава". ИМХО, серьезный повод пересмотреть стиль программирования.
|
|
|
|
|
Aug 19 2014, 06:10
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(KnightIgor @ Aug 18 2014, 19:31)  Сергей, Вы правы. В 2014 году. Для 2009-2010 высказывание смысла не имеет. Похоже, я окончательно потерял нить ваших рассуждений. Если вы работаете с CM-0 - используйте документацию и примеры от CM-0. Причем тут CM-3 независимо от года его рождения? Цитата(Golikov A. @ Aug 19 2014, 08:05)  В большинстве случаев void * может быть прекрасно заменен на char * без какого либо ущерба для функционала или производительности. Это глубокое заблуждение. Будет ущерб производительности программиста. В подавляющем большинстве случаев void * используется в параметрах функций, подобных memcpy(), read(), write(). Это позволяет существенно разгрузить исходник от явных приведений типа при вызове таких функций (приведение в этом случае делается один раз внутри функции). При замене на char * возможность неявного приведения теряется, исходник загромождается явными приведениями. А загроможденный исходник - это совершенно ненужные потери времени на написание и сопровождение.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 19 2014, 07:30
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (KnightIgor @ Aug 18 2014, 18:45)  Когда был ARM7TDMI, было уже известно, что будет Cortex-M3? Нет, известно не было. Но ARM7TDMI (как и нынешний CM0) не поддерживает невыровненные обращения к памяти. П ишете переносимый код - пиш ите его правильно. Ассемблерный код не переносим между архитектурами. QUOTE (KnightIgor @ Aug 18 2014, 18:45)  Когда появился Cortex-M3, и инструкция с отрицательным смещением была допустима, было известно, что появится M0? Если ARM приводит в 2009 пример для Cortex-M3, а именно на ассемблере (речь идет о SVC, и ARM прямо говорит, что без ассемблерной вставки никак), можно ли верить ARM и использовать код? А от PDP-11 ассемблерный код не пробовали Cortex-у скормить? CM0 и CM3 - разные процессоры, с разной системой команд. QUOTE (KnightIgor @ Aug 18 2014, 18:45)  Что будем делать с time_t после 19.01.2038? используйте time_t именно как time_t, не приводите его к другому типу. QUOTE (Golikov A. @ Aug 18 2014, 19:37)  ох... и как жить? почти любой парсер входящих сообщений занимается разбором символьных массивов в нечто большее... И в чем проблема написать CODE char * y; int x = y[0] | (y[1] << 8) | (y[2] << 16) | (y[3]<<24); ? Получите более переносимый результат. QUOTE (Golikov A. @ Aug 18 2014, 19:37)  следить надо читать и помнить. Тем профик и отличается от не пойми кого, у него есть опыт  Приведение указателя от большего типа к меньшему переносимо всегда. В обратную сторону - непереносимо. Пляски с __packet (__attribute, #pragma pack и т.д.) зависят от компилятора. Использовать их можно (и иногда нужно), но переносимости ожидать нельзя.
|
|
|
|
|
Aug 19 2014, 08:21
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Сергей Борщ @ Aug 19 2014, 08:10)  Похоже, я окончательно потерял нить ваших рассуждений. Если вы работаете с CM-0 - используйте документацию и примеры от CM-0. Причем тут CM-3 независимо от года его рождения? Я о том, что нельзя предвидеть будущее с одной стороны, и легко умничать (не упрек Вам, а общее рассуждение) и тыкать НЫНЕ носом в код, несовместимый с процессором, которого не было и в помине в период написания библиотеки. И о том, что несмотря на стремление и утверждение ARM "забыть" ассемблер при работе с Cortex (это же их рекламный слоган был!), есть навороты, когда без этого самого ассемблера (смотри тот же ARM для SVC) ну никак. Я не спорю, что -M0 это иное, чем -M3, и надо учитывать СЕЙЧАС особенности -M0, но учесть их 4-5 лет назад было невозможно по определению. И так будет всегда. И допахивать код придется всегда - тот же time_t. Тут один советчик опустился до вопроса, не пробовал ли я код с PDP-11 на Cortex перенести. Он, видимо, предполагал, что я не знаю, что такое PDP-11. Но в отличие от него, я еще помню НАИЗУСТЬ многие бинарные коды инструкций PDP-11: в советское время CM-1420 и "Электроника". Кстати, MSP430 - это тот самый PDP-11 по идее.
Сообщение отредактировал KnightIgor - Aug 19 2014, 08:52
|
|
|
|
|
Aug 19 2014, 10:29
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (KnightIgor @ Aug 19 2014, 12:21)  Я о том, что нельзя предвидеть будущее с одной стороны, и легко умничать (не упрек Вам, а общее рассуждение) и тыкать НЫНЕ носом в код, несовместимый с процессором, которого не было и в помине в период написания библиотеки. Задолго до появления CM3 были процессоры, требовавшие правильного выравнивания данных. Более того, таких процессорных архитектур и тогда и сейчас - большинство. Вы заложились на редкую фишку и теперь на что-то жалуетесь. QUOTE (KnightIgor @ Aug 19 2014, 12:21)  И о том, что несмотря на стремление и утверждение ARM "забыть" ассемблер при работе с Cortex (это же их рекламный слоган был!), есть навороты, когда без этого самого ассемблера (смотри тот же ARM для SVC) ну никак. Вот что-то не уверен я, что там не обойтись без ассемблера. С другой стороны, низкоуровневый обработчик исключения по определению не может быть переносимым. QUOTE (KnightIgor @ Aug 19 2014, 12:21)  И допахивать код придется всегда - тот же time_t. В _одном_ месте переопределите time_t как long long - и все остальное поедет без переделок. Конечно если вы не преобразовываете time_t в void-указатель. QUOTE (KnightIgor @ Aug 19 2014, 12:21)  Тут один советчик опустился до вопроса, не пробовал ли я код с PDP-11 на Cortex перенести. Он, видимо, предполагал, что я не знаю, что такое PDP-11. Но в отличие от него, я еще помню НАИЗУСТЬ многие бинарные коды инструкций PDP-11: в советское время CM-1420 и "Электроника". Кстати, MSP430 - это тот самый PDP-11 по идее. Я тоже прекрасно помню коды PDP-11, не стоит со мной мериться известным предметом. И придумывать за меня, что я предполагал, тоже не надо.
|
|
|
|
|
Aug 20 2014, 05:39
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(Golikov A. @ Aug 19 2014, 09:05)  В большинстве случаев void * может быть прекрасно заменен на char * без какого либо ущерба для функционала или производительности. Void нужен больше стилистически, что-ли, для понятности кода. Перевожу на русский язык: в большинстве случаев "грузовик" может быть заменен на "автомобиль". У меня только один вопрос, стоит ли при таком подходе удивляться, что вместо контейнеровоза, прислали Форд Фиеста? А в качестве такси, к подъезду подали Камаз?  Цитата(KnightIgor @ Aug 18 2014, 18:45)  Что будем делать с time_t после 19.01.2038? Стесняюсь спросить, а какая связь, между ТИПОМ time_t и неким ЗНАЧЕНИЕМ? Подобный вопрос говорит лишь о непонимании, что есть тип/типизация. Цитата(KnightIgor @ Aug 19 2014, 12:21)  нельзя предвидеть будущее Вот именно поэтому, надо научиться мыслить абстрактно. Надо научиться простой вещи, забыть сами понятия "сколько бит", "какой адрес". Если, не дай Б-г, в голове у программера всплывает вопрос "а сколько бит char?", он должен тут же себе ответить - не твое собачье дело.  Аналогично с адресом. Надо вбить себе в голову, что у переменных есть только один адрес - "где-то". Сколько это "в граммах" - не программерова ума дело. И, предвосхищая следующий вопрос, сразу отвечу, что понятия "адрес" и "область памяти"/"тип памяти" означают совершенно разные вещи. Вот так, легко и непринужденно, раскрывается тема сисек написания переносимого кода.  Цитата(Golikov A. @ Aug 19 2014, 23:40)  явно привожу их к типу void *, тем самым убивая полученную выгоду, но мне кажется что так код понятнее в некоторых местах Ну включаем логику. Как может стать понятнее, если табличку "Иванов, 28 лет, пневмония, лечащий врач Сидоров" заменить на табличку "очередной больной"?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|