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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Формирование int из массива char
AVI-crak
сообщение Feb 13 2016, 20:02
Сообщение #16


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

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(AlexeyT @ Feb 12 2016, 22:32) *
В каком именно месте происходит зависание, сказать не могу, процессор - 1986ВЕ1Т, там с дебагом туго.

Заставили?

Наверное проблема в том что промежуточные значения сохраняются в память,вместо того чтобы висеть в регистрах. Хотя для этого ну уж очень сильно постараться нужно, например объявить несколько глобальных переменных в регистрах мк - и превратить чип в реальный тормоз.
Решение в лоб - переменная uint32_t - для промежуточных вычислений.
И кстати, int - число со знаком равное размеру регистра мк, в этом случае с переносимостью кода будут проблемы, а так-же с простейшим сложением чисел без знака. На С можно любую ересть написать без юзанья int - и этот код будет выполняться на любом процессоре с одинаковым результатом.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 15 2016, 09:14
Сообщение #17


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(AlexeyT @ Feb 12 2016, 18:32) *
В каком именно месте происходит зависание, сказать не могу, процессор - 1986ВЕ1Т, там с дебагом туго.
Ничего туго там нет.
Пишется обработчик hard_fault и всё...
Главное, перед тем как применять этот проц, прочитать еррату, тогда вообще никаких сюрпризов.

Ну, а на счёт __packed для указателя, то в GCC аналогичного инструментария нет -
изучали эту тему несколько лет назад вдоль и поперёк.
Из того что удалось накопать сейчас - это __builtin_assume_aligned(ptr, align), но пока нет времени вникать как это использовать...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 15 2016, 09:40
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(demiurg_spb @ Feb 15 2016, 12:14) *
Ну, а на счёт __packed для указателя, то в GCC аналогичного инструментария нет -
изучали эту тему несколько лет назад вдоль и поперёк.

А я не очень-то понимаю, зачем этот инструментарий вообще где-то есть. Всё то же самое легко делается стандартными средствами языка (тот же memcpy), к тому же этот __packed внутри именно так и работает. ИМХО, это поощрение говнокода и привязка к компилятору, что не есть гут.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 15 2016, 10:05
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Feb 15 2016, 15:40) *
А я не очень-то понимаю, зачем этот инструментарий вообще где-то есть. Всё то же самое легко делается стандартными средствами языка (тот же memcpy), к тому же этот __packed внутри именно так и работает. ИМХО, это поощрение говнокода и привязка к компилятору, что не есть гут.

В смысле - так и работает? И при чём тут говнокод? То, что этот метод не универсален между компиляторами - конечно плохо.
Чтение __packed uint для Cortex-M скомпилится в одну инструкцию LDR, для ARM7/9 - в набор LDRB/ORR.
А с memcpy() - в разы более громоздко + нужна доп. память. Что для embedded применений может быть критично.
Более универсальный метод - определение класса с перегруженными операторами приведения типа и присваивания. Иногда я поступаю так если нужна переносимость. Но __packed - проще.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 15 2016, 10:35
Сообщение #20


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(scifi @ Feb 15 2016, 12:40) *
А я не очень-то понимаю, зачем этот инструментарий вообще где-то есть.
Удобно, когда можно объявить указатель "на куда угодно" и работать через него без всяких танцев с бубном...
ИМХО никакого говнокода.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 15 2016, 10:43
Сообщение #21


Гуру
******

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



Цитата(scifi @ Feb 15 2016, 11:40) *
ИМХО, это поощрение говнокода и привязка к компилятору, что не есть гут.
А по мне так наоборот - если происходит действие "обращение по указателю" - то логично было бы использовать предусмотренные для этого в языке средства разыменования указателя, а не захламлять исходник вызовами memcpy(). То, что этот указатель учитывает какие-то аппаратные особенности (невыровненный доступ), логично было бы как-то указать один раз при объявлении указателя (тот же __packed), а не распылять по исходнику в виде memcpy() и надеяться, что программист не забудет именно этот указатель использовать через memcpy().

В gcc можно обернуть искомые данные в упакованную структуру и обращаться по указателю на эту структуру.


--------------------
На любой вопрос даю любой ответ
"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
dimka76
сообщение Feb 15 2016, 11:19
Сообщение #22


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(demiurg_spb @ Feb 15 2016, 12:14) *
Ну, а на счёт __packed для указателя, то в GCC аналогичного инструментария нет -
изучали эту тему несколько лет назад вдоль и поперёк.
Из того что удалось накопать сейчас - это __builtin_assume_aligned(ptr, align), но пока нет времени вникать как это использовать...


Код
typedef volatile uint32_t REG32;
#define pREG32 (REG32 *)
#define USB_TXDATA                                (*(pREG32 (0x4002001C)))

uint8_t *pData;

USB_TXDATA = *((uint32_t __attribute__((packed)) *)pData);


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 15 2016, 11:29
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(dimka76 @ Feb 15 2016, 14:19) *
Код
USB_TXDATA = *((uint32_t __attribute__((packed)) *)pData);

Как мёртвому припарка, то есть никакого эффекта. Собственно, и не должно работать, так как мануал пишет, что эта штука работает только с объявлением структуры, объединения или перечисления.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Feb 15 2016, 11:34
Сообщение #24


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(scifi @ Feb 15 2016, 14:29) *
Как мёртвому припарка, то есть никакого эффекта. Собственно, и не должно работать, так как мануал пишет, что эта штука работает только с объявлением структуры, объединения или перечисления.


Я взял это из примера от NXP.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 15 2016, 11:36
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(dimka76 @ Feb 15 2016, 14:34) *
Я взял это из примера от NXP.

Ну и отлично. Передавайте им привет и попросите впредь не говнокодить.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 15 2016, 13:57
Сообщение #26


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(scifi @ Feb 15 2016, 14:36) *
Передавайте им привет и попросите впредь не говнокодить.
Если этот пример для ARM компилятора, то имеет место быть...
А для gcc это не проходит, поэтому плохой пример NXP подаёт.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 15 2016, 14:32
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Сергей Борщ @ Feb 15 2016, 12:43) *
В gcc можно обернуть искомые данные в упакованную структуру и обращаться по указателю на эту структуру.

А поскольку так можно делать на любом компиляторе, то так не только можно, но и следует делать всегда.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Feb 15 2016, 15:19
Сообщение #28


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

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Даже в случае безумного С кода, на асме получается необходимый минимум. В даже если проц не может читать/писать не выровненное - этот кусок он обязан выполнить.

Код
    ldr      r1, =адрес_char
    mov     r3, #0
    ldrb    r0, [r1], #4
    add     r3, r3, r0,
    ldrb    r0, [r1], #4
    add     r3, r3, r0, lsl #8
    ldrb    r0, [r1], #4
    add     r3, r3, r0, lsl #16
    ldrb    r0, [r1], #4
    add     r3, r3, r0, lsl #24
    ldr     r1, =адрес_uint32_t
    str     r3, [r1]


Сообщение отредактировал AVI-crak - Feb 15 2016, 15:19
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 15 2016, 18:02
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(AVI-crak @ Feb 15 2016, 18:19) *
Даже в случае безумного С кода, на асме получается необходимый минимум.

И это тоже. Прогресс в компиляторостроении привёл к тому, что вот эти стенания "а как же эти лишние две инструкции?" - зачастую устаревшая выдумка. Но даже если не так, пара лишних тактов и байтов вредит крайне редко. Короче, "преждевременная оптимизация", если говорить без матюков, но иметь в виду именно их smile3009.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 15 2016, 18:44
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (scifi @ Feb 15 2016, 20:02) *
И это тоже. Прогресс в компиляторостроении привёл к тому, что вот эти стенания "а как же эти лишние две инструкции?" - зачастую устаревшая выдумка. Но даже если не так, пара лишних тактов и байтов вредит крайне редко. Короче, "преждевременная оптимизация", если говорить без матюков, но иметь в виду именно их smile3009.gif

К чему в очередной раз поминание древней глупости - "преждевременная оптимизация" ?
http://electronix.ru/forum/index.php?showt...t&p=1348755


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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