|
|
  |
Формирование int из массива char |
|
|
|
Feb 13 2016, 20:02
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894

|
Цитата(AlexeyT @ Feb 12 2016, 22:32)  В каком именно месте происходит зависание, сказать не могу, процессор - 1986ВЕ1Т, там с дебагом туго. Заставили? Наверное проблема в том что промежуточные значения сохраняются в память,вместо того чтобы висеть в регистрах. Хотя для этого ну уж очень сильно постараться нужно, например объявить несколько глобальных переменных в регистрах мк - и превратить чип в реальный тормоз. Решение в лоб - переменная uint32_t - для промежуточных вычислений. И кстати, int - число со знаком равное размеру регистра мк, в этом случае с переносимостью кода будут проблемы, а так-же с простейшим сложением чисел без знака. На С можно любую ересть написать без юзанья int - и этот код будет выполняться на любом процессоре с одинаковым результатом.
|
|
|
|
|
Feb 15 2016, 09:14
|

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

|
Цитата(AlexeyT @ Feb 12 2016, 18:32)  В каком именно месте происходит зависание, сказать не могу, процессор - 1986ВЕ1Т, там с дебагом туго. Ничего туго там нет. Пишется обработчик hard_fault и всё... Главное, перед тем как применять этот проц, прочитать еррату, тогда вообще никаких сюрпризов. Ну, а на счёт __packed для указателя, то в GCC аналогичного инструментария нет - изучали эту тему несколько лет назад вдоль и поперёк. Из того что удалось накопать сейчас - это __builtin_assume_aligned(ptr, align), но пока нет времени вникать как это использовать...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 15 2016, 10:05
|
Гуру
     
Группа: Свой
Сообщений: 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 - проще.
|
|
|
|
|
Feb 15 2016, 10:43
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Feb 15 2016, 11:19
|

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);
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Feb 15 2016, 11:34
|

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

|
Цитата(scifi @ Feb 15 2016, 14:29)  Как мёртвому припарка, то есть никакого эффекта. Собственно, и не должно работать, так как мануал пишет, что эта штука работает только с объявлением структуры, объединения или перечисления. Я взял это из примера от NXP.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Feb 15 2016, 15:19
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 15 2016, 18:44
|

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

|
QUOTE (scifi @ Feb 15 2016, 20:02)  И это тоже. Прогресс в компиляторостроении привёл к тому, что вот эти стенания "а как же эти лишние две инструкции?" - зачастую устаревшая выдумка. Но даже если не так, пара лишних тактов и байтов вредит крайне редко. Короче, "преждевременная оптимизация", если говорить без матюков, но иметь в виду именно их  К чему в очередной раз поминание древней глупости - "преждевременная оптимизация" ? http://electronix.ru/forum/index.php?showt...t&p=1348755
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|