реклама на сайте
подробности

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> Прошу помощи с STM32F051, Периодическое сваливание в HardFault
KnightIgor
сообщение Aug 18 2014, 12:31
Сообщение #46


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Сергей Борщ @ Aug 18 2014, 11:56) *
Почему вы упорно валите с больной головы на здоровую?

Я не валю, тем более упорно. Я подцепил вброс Golikov A. (перенос библиотек), который простекает из двух основных проблем программирования: нельзя видеть будущее (и написать библиотеку на все случаи жизни), и нужно обеспечивать совместимость с предыдущей версией. Это хорошо проснуться десятилетием позже и охватить все варианты мудрым взором. Но Вы ведь помните, что сначала был M3, а лишь много позже ARM замутил M0, который вдруг не понимает отрицательных смещений и невыровненного доступа. И куда податься крестьянину? Ответ: перепахать огород. Я, кстати, совершенно с Вами согласен, что строгое программирование (в обсуждаемом случае __packed) может избавить от косяков. Но только честно: пусть в нас кинет камень тот, чей код соответствует MISRA.

Цитата
То есть вас удивляет, что ассемблерный код для одного ядра не ассемблируется для другого??? А почему вас тогда не удивляет, что код для Пентиума не ассемблируется под 8086? Простите, но это напоминает анекдот:
- У меня на телефоне фотографии нечеткими получаются.
- Да ладно? Прикинь, а у меня с фотоаппарата вообще звонить нельзя!

По поводу 8086 и Пентиума - я изложил в первом абзаце. Если пофилосовствовать же, то меня ничто не удивляет в мире диалектики. Ясно одно: чтобы понять настоящее, надо знать предысторию. Правда, один немецкий филосов сказал, что главный урок состоит истории в том, что никто не извлекает из нее уроков. Кстати, Ваш анекдот в части телефона никто бы не понял еще лет 20 назад. На Ваш анекдот отвечу другим:
- Почему Богу удалось создать мир всего да 6 дней?
- Не нужно было обеспечивать совместимость с предыдущей версией.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 18 2014, 12:48
Сообщение #47


Гуру
******

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



Цитата(KnightIgor @ Aug 18 2014, 15:31) *
Но Вы ведь помните, что сначала был M3, а лишь много позже ARM замутил M0, который вдруг не понимает отрицательных смещений и невыровненного доступа. И куда податься крестьянину?
Никуда не подаваться. Это новое ядро и под него нужен новый код. Тот факт, что некоторые инструкции совпадают - считать недоразумением.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
LightElf
сообщение Aug 18 2014, 13:13
Сообщение #48


Частый гость
**

Группа: Участник
Сообщений: 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. Вполне логично ожидать, что ассемблерный код для одной архитектуры не будет переносим на другую архитектуру. На то он и ассемблерный код.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Aug 18 2014, 14:45
Сообщение #49


Знающий
****

Группа: Участник
Сообщений: 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?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 18 2014, 15:09
Сообщение #50


Гуру
******

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



Цитата(KnightIgor @ Aug 18 2014, 17:45) *
Если ARM приводит в 2009 пример для Cortex-M3, а именно на ассемблере (...) можно ли верить ARM и использовать код?
Использовать для Cortex-M3 - можно. Этот же код для Cortex-M0 - чаще всего нет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 18 2014, 15:37
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Из указателя на int делать указатель на char можно. А наоборот - нельз

ох... и как жить? почти любой парсер входящих сообщений занимается разбором символьных массивов в нечто большее...

следить надо читать и помнить. Тем профик и отличается от не пойми кого, у него есть опытsm.gif
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Aug 18 2014, 16:31
Сообщение #52


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Aug 19 2014, 03:16
Сообщение #53


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(Golikov A. @ Aug 18 2014, 15:39) *
получается лучше все указатели что void* передавать как указатели на пакованный тип? А лучше вообще все так передавать?

Получается (с), что в голове у программера надо навести порядок. Что программеру предоставлен такой инструмент, как типизация. Что этот инструмент помогает избежать ошибок. Что используя void, программер отказывается от этого инструмента, а значит, всю ответственность, по части контроля за ошибками, программер берет на себя. Из чего следует, что очень желательно избегать void, где это только возможно. А если по каким-то причинам пришлось отказаться от типизации, то худшее место, где это можно сделать - "пограничная застава". ИМХО, серьезный повод пересмотреть стиль программирования. wink.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 19 2014, 05:05
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



даже в мего защищенном С# есть object и var. Так что насчет стиля не согласен, согласен с тем что если пошли по этому пути то надо следить самому и учитывать особенности архитектуры.

В большинстве случаев void * может быть прекрасно заменен на char * без какого либо ущерба для функционала или производительности. Void нужен больше стилистически, что-ли, для понятности кода.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 19 2014, 06:10
Сообщение #55


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
LightElf
сообщение Aug 19 2014, 07:30
Сообщение #56


Частый гость
**

Группа: Участник
Сообщений: 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) *
следить надо читать и помнить. Тем профик и отличается от не пойми кого, у него есть опытsm.gif

Приведение указателя от большего типа к меньшему переносимо всегда. В обратную сторону - непереносимо. Пляски с __packet (__attribute, #pragma pack и т.д.) зависят от компилятора. Использовать их можно (и иногда нужно), но переносимости ожидать нельзя.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Aug 19 2014, 08:21
Сообщение #57


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
LightElf
сообщение Aug 19 2014, 10:29
Сообщение #58


Частый гость
**

Группа: Участник
Сообщений: 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, не стоит со мной мериться известным предметом. И придумывать за меня, что я предполагал, тоже не надо.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 19 2014, 19:40
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Сергей Борщ очень правильно указал зачем применяется тип void *. Правда часто для массивов в том же memcpy я явно привожу их к типу void *, тем самым убивая полученную выгоду, но мне кажется что так код понятнее в некоторых местах. Это сродни комментариям, то есть как бы явное указание что в этом месте я не ошибся, а именно это хотел передать в функцию...

Но конструкция (char *)& - правда весьма не маленькая, и если параметров много, строчка будет длинной...
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Aug 20 2014, 05:39
Сообщение #60


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(Golikov A. @ Aug 19 2014, 09:05) *
В большинстве случаев void * может быть прекрасно заменен на char * без какого либо ущерба для функционала или производительности. Void нужен больше стилистически, что-ли, для понятности кода.

Перевожу на русский язык: в большинстве случаев "грузовик" может быть заменен на "автомобиль". У меня только один вопрос, стоит ли при таком подходе удивляться, что вместо контейнеровоза, прислали Форд Фиеста? А в качестве такси, к подъезду подали Камаз? biggrin.gif

Цитата(KnightIgor @ Aug 18 2014, 18:45) *
Что будем делать с time_t после 19.01.2038?

Стесняюсь спросить, а какая связь, между ТИПОМ time_t и неким ЗНАЧЕНИЕМ? Подобный вопрос говорит лишь о непонимании, что есть тип/типизация.

Цитата(KnightIgor @ Aug 19 2014, 12:21) *
нельзя предвидеть будущее

Вот именно поэтому, надо научиться мыслить абстрактно. Надо научиться простой вещи, забыть сами понятия "сколько бит", "какой адрес". Если, не дай Б-г, в голове у программера всплывает вопрос "а сколько бит char?", он должен тут же себе ответить - не твое собачье дело. biggrin.gif Аналогично с адресом. Надо вбить себе в голову, что у переменных есть только один адрес - "где-то". Сколько это "в граммах" - не программерова ума дело. И, предвосхищая следующий вопрос, сразу отвечу, что понятия "адрес" и "область памяти"/"тип памяти" означают совершенно разные вещи.

Вот так, легко и непринужденно, раскрывается тема сисек написания переносимого кода. biggrin.gif

Цитата(Golikov A. @ Aug 19 2014, 23:40) *
явно привожу их к типу void *, тем самым убивая полученную выгоду, но мне кажется что так код понятнее в некоторых местах

Ну включаем логику. Как может стать понятнее, если табличку "Иванов, 28 лет, пневмония, лечащий врач Сидоров" заменить на табличку "очередной больной"? wink.gif
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016