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

 
 
6 страниц V  « < 2 3 4 5 6 >  
Reply to this topicStart new topic
Forger
сообщение Jun 23 2016, 08:12
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Влад Р. @ Jun 23 2016, 08:52) *
Появилась новая проблема - написание обработчика прерывания на асме.
Абсолютно тупиковый путь, особенное, если планируется расширять проект (код)!
Я бы просто заново спроектировал проект.
Скорее всего нужно переходить на ртос, тогда число всяких обработчиков прерываний резко сократиться - ведь не на все события нужно реагировать с точность до мкс, опрашивать кнопки тоже нет смысла чаще, чем раз в 50мс. Т.е. для таких вещей хватает одного системного таймера оси (у меня такт в основном 1мс).
Короче, самописный асм на ARMе в своем коде - это крайне опасная и нежелательная вещь, ее нужно всячески избегать и исключать еще на этапе проектирования кода.





--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 23 2016, 08:12
Сообщение #47


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(scifi @ Jun 22 2016, 21:08) *
Слив защщитан biggrin.gif


Из оффсайда…

Так что ни разу wink.gif

Сообщение отредактировал Obam - Jun 23 2016, 08:18


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 23 2016, 08:19
Сообщение #48


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата
Измените переменные на 32-битовые. Везде, где можно.

Это уже сделали? Где листинг?

Цитата(Влад Р. @ Jun 23 2016, 08:52) *
Появилась новая проблема - написание обработчика прерывания на асме.

Только в качестве обучающего занятия. Примеры можно найти в книжках Дж. Ю, на одну из которых я ссылался.
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 23 2016, 08:27
Сообщение #49


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(GetSmart @ Jun 22 2016, 22:19) *
… Bit-banding в СМ0 нет и не ожидается (без намёков). Точнее, подчеркивали что эта фича характерна для СМ3 и выше. И, как уже сказано, её не было в описании ARMv6-М от самого АРМа. В Architecture Reference Manual на какое-то ядро обазано быть данное описание.


Справедливости ради в Architecture Reference Manual этой темы нет, она отражена в Technical Reference Manual.

Цитата(Влад Р. @ Jun 23 2016, 09:52) *
Появилась новая проблема - написание обработчика прерывания на асме.

Кто-то может поделиться полезными ссылками, вроде каких-нибудь уроков, курсов в сети. Возможно есть проекты в свободном доступе, где прерывания тоже реализовывались на асме и работали с сишным кодом. Тоже будет полезно.


Прикрепленный файл  Vincent_Mahout_AssemblyLanguageProgramming_ARM_CortexM3.pdf ( 4.06 мегабайт ) Кол-во скачиваний: 164



--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 23 2016, 08:54
Сообщение #50


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Цитата(Forger @ Jun 23 2016, 11:12) *
Абсолютно тупиковый путь, особенное, если планируется расширять проект (код)!
Я бы просто заново спроектировал проект.
Скорее всего нужно переходить на ртос, тогда число всяких обработчиков прерываний резко сократиться - ведь не на все события нужно реагировать с точность до мкс, опрашивать кнопки тоже нет смысла чаще, чем раз в 50мс. Т.е. для таких вещей хватает одного системного таймера оси (у меня такт в основном 1мс).
Короче, самописный асм на ARMе в своем коде - это крайне опасная и нежелательная вещь, ее нужно всячески избегать и исключать еще на этапе проектирования кода.

По-моему RTOS сейчас только замедлит код, а основное требование сейчас - это максимальное быстродействие и минимальное число "лишних" команд. Сейчас задействовано всего одно внешнее прерывание. Почему под ARMы нужно избегать самописного ассемблерного кода, вроде как ASM-код - это эталон быстродействия для любой платформы?

Цитата(ViKo @ Jun 23 2016, 11:19) *
Это уже сделали? Где листинг?

Только в качестве обучающего занятия. Примеры можно найти в книжках Дж. Ю, на одну из которых я ссылался.

А для более широких задач почему не подойдет?
Заменил на fastы. stdint вместо них подставляет int. Вот листинг:
CODE
68: {
0x08000240 B430 PUSH {r4-r5}
69: uint_fast16_t db = GPIOC->IDR & 0x1FFF;
70: uint_fast8_t data/* = db & 0xFF*/;
71:
0x08000242 481D LDR r0,[pc,#116] ; @0x080002B8
0x08000244 8A00 LDRH r0,[r0,#0x10]
72: GPIOB->BSRR = GPIO_BSRR_BS_12;
73:
0x08000246 2201 MOVS r2,#0x01
0x08000248 04C1 LSLS r1,r0,#19
0x0800024A 0CC9 LSRS r1,r1,#19
0x0800024C 481B LDR r0,[pc,#108] ; @0x080002BC
0x0800024E 0312 LSLS r2,r2,#12
0x08000250 6182 STR r2,[r0,#0x18]
74: data = db & 0xFF;
75:
0x08000252 B2CB UXTB r3,r1
76: if (!(db & (0x01 << 12))) {
0x08000254 04CA LSLS r2,r1,#19
68: {
69: uint_fast16_t db = GPIOC->IDR & 0x1FFF;
70: uint_fast8_t data/* = db & 0xFF*/;
71:
72: GPIOB->BSRR = GPIO_BSRR_BS_12;
73:
74: data = db & 0xFF;
75:
76: if (!(db & (0x01 << 12))) {
0x08000256 D429 BMI 0x080002AC
77: switch (db & (0x03 << 9)) {
78: case 0x0000:
0x08000258 2203 MOVS r2,#0x03
0x0800025A 0252 LSLS r2,r2,#9
0x0800025C 4011 ANDS r1,r1,r2
79: GPIOA->ODR = (GPIOA->ODR & ~0xFF) | data;
0x0800025E 4A18 LDR r2,[pc,#96] ; @0x080002C0
0x08000260 D008 BEQ 0x08000274
0x08000262 39FF SUBS r1,r1,#0xFF
0x08000264 39FF SUBS r1,r1,#0xFF
0x08000266 1E89 SUBS r1,r1,#2
0x08000268 D00A BEQ 0x08000280
0x0800026A 39FF SUBS r1,r1,#0xFF
0x0800026C 39FF SUBS r1,r1,#0xFF
0x0800026E 2902 CMP r1,#0x02
0x08000270 D11C BNE 0x080002AC
0x08000272 E00C B 0x0800028E
0x08000274 8A90 LDRH r0,[r2,#0x14]
0x08000276 0A00 LSRS r0,r0,#8
0x08000278 0200 LSLS r0,r0,#8
0x0800027A 4318 ORRS r0,r0,r3
0x0800027C 8290 STRH r0,[r2,#0x14]
80: break;
81: case 0x0200:
0x0800027E E015 B 0x080002AC
82: GPIOB->ODR = (GPIOB->ODR & ~(0x03 << 5)) | (data & (0x03 << 5));
0x08000280 8A82 LDRH r2,[r0,#0x14]
0x08000282 2160 MOVS r1,#0x60
0x08000284 438A BICS r2,r2,r1
0x08000286 400B ANDS r3,r3,r1
0x08000288 431A ORRS r2,r2,r3
0x0800028A 8282 STRH r2,[r0,#0x14]
83: break;
84: case 0x0400:
0x0800028C E00E B 0x080002AC
85: GPIOA->ODR = (GPIOA->ODR & ~(0x0F << 8)) | ((uint16_t)HINIBBLE(data) << 8);
0x0800028E 8A91 LDRH r1,[r2,#0x14]
0x08000290 240F MOVS r4,#0x0F
0x08000292 0224 LSLS r4,r4,#8
0x08000294 031D LSLS r5,r3,#12
0x08000296 0C2D LSRS r5,r5,#16
0x08000298 43A1 BICS r1,r1,r4
0x0800029A 022D LSLS r5,r5,#8
0x0800029C 4329 ORRS r1,r1,r5
0x0800029E 8291 STRH r1,[r2,#0x14]
86: GPIOB->ODR = (GPIOB->ODR & ~(0x0F << 8)) | ((uint16_t)LONIBBLE(data) << 8);
87: break;
88: case 0x0600:
89: break;
90: }
91: }
0x080002A0 8A81 LDRH r1,[r0,#0x14]
0x080002A2 071A LSLS r2,r3,#28
0x080002A4 43A1 BICS r1,r1,r4
0x080002A6 0D12 LSRS r2,r2,#20
0x080002A8 4311 ORRS r1,r1,r2
0x080002AA 8281 STRH r1,[r0,#0x14]
92: EXTI->PR = EXTI_PR_PR8;
0x080002AC 20FF MOVS r0,#0xFF
0x080002AE 4905 LDR r1,[pc,#20] ; @0x080002C4
0x080002B0 3001 ADDS r0,r0,#0x01
0x080002B2 6148 STR r0,[r1,#0x14]
93: }
0x080002B4 BC30 POP {r4-r5}
0x080002B6 4770 BX lr
0x080002B8 0800 DCW 0x0800
0x080002BA 4800 DCW 0x4800
0x080002BC 0400 DCW 0x0400
0x080002BE 4800 DCW 0x4800
0x080002C0 0000 DCW 0x0000
0x080002C2 4800 DCW 0x4800
0x080002C4 0400 DCW 0x0400
0x080002C6 4001 DCW 0x4001



Цитата(Obam @ Jun 23 2016, 11:27) *
Vincent_Mahout_AssemblyLanguageProgramming_ARM_CortexM3.pdf

Похоже, то что нужно. Спасибо!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 23 2016, 09:13
Сообщение #51


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Что-то не впечатляет результат... Надо бы не просто переменные сделать int, а саму логику работы перевести на int.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 23 2016, 09:13
Сообщение #52


Гуру
******

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



Цитата(Влад Р. @ Jun 23 2016, 11:54) *
Заменил на fastы. stdint вместо них подставляет int. Вот листинг:

Такой код, конечно, можно ускорить, если вылизать на ассемблере. Правда, не очень благодарное это занятие.
Кстати, сишный код неоптимальный. К примеру, вместо
GPIOA->ODR = (GPIOA->ODR & ~0xFF) | data;
лучше написать
GPIOA->BSRR = 0x00FF0000 | data;
Ну и ещё что-то там наверняка есть.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 23 2016, 09:26
Сообщение #53


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Влад Р. @ Jun 23 2016, 11:54) *
По-моему RTOS сейчас только замедлит код, а основное требование сейчас - это максимальное быстродействие и минимальное число "лишних" команд.
Лишних команд не бывает, а бывают деньги, заплаченные закачиком на разработку впустую crying.gif
Заказчику как правило совершенно до лампочки как внутри реализована задача, главное цена - и время (время = деньги), разумеется, изделие должно соотв. ТЗ.
Я лично никогда не буду экономить на цене МК в изделии, которое стоит как минимум в сотню раз дороже, чем этот МК, и
поэтмоу заложу такой МК, которого хватит с запасом! В крайнем случае его можно заменить и перенести код на него со старого МК.
Кстати, если код был написан через одно место (ASM-вставки, отсутствует система именования, не испоьзуются SVN и т.п.), то это создаст огромную проблему.
Более того, крайне затруднительно использование такого кривого разового кода в других проектах, а это тоже адская потеря времени и денег.

Цитата
Сейчас задействовано всего одно внешнее прерывание.

Сколько всего прерываний в коде?

Цитата
Почему под ARMы нужно избегать самописного ассемблерного кода,
См. выше.
Не только под ARM, а везде подобный колхоз = зло. Пройдет полгода и попробуйте в нем разобраться или не дай бог кто-то другой будет за вами это делать...
Проклянут до 10го колена sm.gif


Цитата
вроде как ASM-код - это эталон быстродействия для любой платформы?
Это - величайший миф всех времен и народов! sm.gif

Мы щас отклоняемся от темы в сторону классических и бессмысленных холиваров типа ASM vs C и т.п. Это бессмыслено.

Еще раз: для каждой коммерческой задачи существут бюджет!
Вполне возможно, что для примитивных, но очень крупносерийных изделиях есть смысл использовать ASM (в крайне редких случаях), но я не участвовал в таких проектах.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 23 2016, 09:33
Сообщение #54


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Цитата(scifi @ Jun 23 2016, 12:13) *
Кстати, сишный код неоптимальный. К примеру, вместо
GPIOA->ODR = (GPIOA->ODR & ~0xFF) | data;
лучше написать
GPIOA->BSRR = 0x00FF0000 | data;
Ну и ещё что-то там наверняка есть.


Да, этот момент я упустил. Сомневался нормально ли отработает установка/сброс одних и тех же битов. Перечитал мануал и переделал:
CODE
68: {
0x08000240 B410 PUSH {r4}
69: uint_fast16_t db = GPIOC->IDR & 0x1FFF;
70: uint_fast8_t data/* = db & 0xFF*/;
71:
0x08000242 481A LDR r0,[pc,#104] ; @0x080002AC
0x08000244 8A00 LDRH r0,[r0,#0x10]
72: GPIOB->BSRR = GPIO_BSRR_BS_12;
73:
0x08000246 4A1A LDR r2,[pc,#104] ; @0x080002B0
0x08000248 04C1 LSLS r1,r0,#19
0x0800024A 0CC9 LSRS r1,r1,#19
0x0800024C 2001 MOVS r0,#0x01
0x0800024E 0300 LSLS r0,r0,#12
0x08000250 6190 STR r0,[r2,#0x18]
74: data = db & 0xFF;
75:
0x08000252 B2C8 UXTB r0,r1
76: if (!(db & (0x01 << 12))) {
0x08000254 04CB LSLS r3,r1,#19
68: {
69: uint_fast16_t db = GPIOC->IDR & 0x1FFF;
70: uint_fast8_t data/* = db & 0xFF*/;
71:
72: GPIOB->BSRR = GPIO_BSRR_BS_12;
73:
74: data = db & 0xFF;
75:
76: if (!(db & (0x01 << 12))) {
0x08000256 D423 BMI 0x080002A0
77: switch (db & (0x03 << 9)) {
78: case 0x0000:
0x08000258 2303 MOVS r3,#0x03
0x0800025A 025B LSLS r3,r3,#9
0x0800025C 4019 ANDS r1,r1,r3
79: GPIOA->BSRR = (0xFF << 16) | data;
0x0800025E 4B15 LDR r3,[pc,#84] ; @0x080002B4
0x08000260 D008 BEQ 0x08000274
0x08000262 39FF SUBS r1,r1,#0xFF
0x08000264 39FF SUBS r1,r1,#0xFF
0x08000266 1E89 SUBS r1,r1,#2
0x08000268 D009 BEQ 0x0800027E
0x0800026A 39FF SUBS r1,r1,#0xFF
0x0800026C 39FF SUBS r1,r1,#0xFF
0x0800026E 2902 CMP r1,#0x02
0x08000270 D116 BNE 0x080002A0
0x08000272 E00A B 0x0800028A
0x08000274 21FF MOVS r1,#0xFF
0x08000276 0409 LSLS r1,r1,#16
0x08000278 4308 ORRS r0,r0,r1
0x0800027A 6198 STR r0,[r3,#0x18]
80: break;
81: case 0x0200:
0x0800027C E010 B 0x080002A0
82: GPIOB->BSRR = (0x03 << 21) | (data & (0x03 << 5));
0x0800027E 2160 MOVS r1,#0x60
0x08000280 4008 ANDS r0,r0,r1
0x08000282 0409 LSLS r1,r1,#16
0x08000284 1840 ADDS r0,r0,r1
0x08000286 6190 STR r0,[r2,#0x18]
83: break;
84: case 0x0400:
0x08000288 E00A B 0x080002A0
85: GPIOA->BSRR = (0x0F << 24) | ((uint16_t)HINIBBLE(data) << 8);
0x0800028A 0301 LSLS r1,r0,#12
0x0800028C 0C09 LSRS r1,r1,#16
0x0800028E 020C LSLS r4,r1,#8
0x08000290 210F MOVS r1,#0x0F
0x08000292 0609 LSLS r1,r1,#24
0x08000294 1864 ADDS r4,r4,r1
0x08000296 619C STR r4,[r3,#0x18]
86: GPIOB->BSRR = (0x0F << 24) | ((uint16_t)LONIBBLE(data) << 8);
87: break;
88: }
89: }
0x08000298 0700 LSLS r0,r0,#28
0x0800029A 0D00 LSRS r0,r0,#20
0x0800029C 1840 ADDS r0,r0,r1
0x0800029E 6190 STR r0,[r2,#0x18]
90: EXTI->PR = EXTI_PR_PR8;
0x080002A0 20FF MOVS r0,#0xFF
0x080002A2 4905 LDR r1,[pc,#20] ; @0x080002B8
0x080002A4 3001 ADDS r0,r0,#0x01
0x080002A6 6148 STR r0,[r1,#0x14]
91: }
0x080002A8 BC10 POP {r4}
0x080002AA 4770 BX lr
0x080002AC 0800 DCW 0x0800
0x080002AE 4800 DCW 0x4800
0x080002B0 0400 DCW 0x0400
0x080002B2 4800 DCW 0x4800
0x080002B4 0000 DCW 0x0000
0x080002B6 4800 DCW 0x4800
0x080002B8 0400 DCW 0x0400
0x080002BA 4001 DCW 0x4001


Цитата(Forger @ Jun 23 2016, 12:26) *
Лишних команд не бывает, а бывают деньги, заплаченные закачиком на разработку впустую crying.gif
Заказчику как правило совершенно до лампочки как внутри реализована задача

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

Цитата(Forger @ Jun 23 2016, 12:26) *
Сколько всего прерываний в коде?

В данный момент в коде включена обработка только ОДНОГО прерывания.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 23 2016, 09:54
Сообщение #55


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Влад Р. @ Jun 23 2016, 12:33) *
В данный момент в коде включена обработка только ОДНОГО прерывания.

Если уже в данный момент уперлись в производительность (приходится лезть в асм), то потом будет только хуже. Вас это не пугает? laughing.gif
Лично я бы в подобной ситуации уже забил тревогу и начал напрягать железячников, а пока они исправляют железо, ковырял бы это... Так сказать, "подстелить соломки" sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 23 2016, 10:17
Сообщение #56


Гуру
******

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



Цитата(scifi @ Jun 23 2016, 15:13) *
Такой код, конечно, можно ускорить, если вылизать на ассемблере. Правда, не очень благодарное это занятие.
Кстати, сишный код неоптимальный. К примеру, вместо
...

Там много неоптимального, куча лишних операций, даже на си. Такое ощущение что старались написать как можно более тормозной код...
Например if (!(db & (0x01 << 12))) { - совершенно лишнее. Нужно убрать, а следующую строку заменить на switch (db & (3 << 9 | 1 << 12)) {.
Операция & 0x1FFF в первой строке тоже совершенно не нужная, генерит две лишних ассемблерных команды.
Операция ((uint16_t)HINIBBLE(data) << 8) - как будто специально написано, так чтобы было как можно тормознее - она генерит 3 команды + 1 команда предварительно:
Код
0x08000252 B2C8      UXTB     r0,r1
...
0x0800028A 0301      LSLS     r1,r0,#12
0x0800028C 0C09      LSRS     r1,r1,#16
0x0800028E 020C      LSLS     r4,r1,#8

Если не создавать отдельной переменной data и убрать операцию & 0x1FFF из первой строки, то достаточно будет 2-х команд, а не 4, да и кол-во используемых регистров сократится, а значит - меньше контекста надо сохранять/восстанавливать. Хотя это наверное на си не сделать, а только на асм.
И ещё куча мест.
Вобщем: код писал какой-то школьник, плохо дружащий с алгоритмизацией и программированием. sm.gif

Цитата(Влад Р. @ Jun 23 2016, 11:52) *
Появилась новая проблема - написание обработчика прерывания на асме.
Мои знания в асме близки к нулю, тем более под ARMы.

Берёте полученный листинг (лучше сделанный с полной оптимизацией), описание команд Cortex-M0 и разбираетесь.
Команды отсюда (для своего ядра):
http://infocenter.arm.com/help/index.jsp

Цитата(Forger @ Jun 23 2016, 15:26) *
Вполне возможно, что для примитивных, но очень крупносерийных изделиях есть смысл использовать ASM (в крайне редких случаях), но я не участвовал в таких проектах.

Да ладно Вам утрировать! Всё уместно в меру. И никакой сложности в написании асм-функции в десяток строк нет. И с поддержкой такого кода тож.
Сильно сомневаюсь что потребуется куда-то это переносить "в будущие проекты", так как это часть - аппаратно-зависима (ногодрыг) и в новом проекте будет делаться всё равно по-новой.
К тому-же - переносить на какие-то другие ядра - крайне маловероятно.
Даже ОС, за которые Вы так горячо пропагандируете, не обходятся без асм-вставок для переключения контекста и т.п.
А то что аппаратная реализация и, возможно, МК выбраны неправильно - я с Вами соглашусь.

Цитата(Forger @ Jun 23 2016, 15:54) *
Лично я бы в подобной ситуации уже забил тревогу и начал напрягать железячников, а пока они исправляют железо, ковырял бы это... Так сказать, "подстелить соломки" sm.gif

Вы не задумывались что этого железа может быть выпущено уже вагон + маленькая тележка? А может уже и у заказчиков многих стоит. sm.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 23 2016, 10:20
Сообщение #57


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Obam @ Jun 23 2016, 12:27) *
Справедливости ради в Architecture Reference Manual этой темы нет, она отражена в Technical Reference Manual.

Arch RM описывает более общую группу. Tech RM описывает конкретное ядро (CM0, CM0+ и пр.) с ревизией и патчем. Указывать bit-banding логично в более общем документе, если опция относится ко всем элементам группы. Или ко многим.

Сообщение отредактировал GetSmart - Jun 23 2016, 14:35


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 23 2016, 10:34
Сообщение #58


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ Jun 23 2016, 13:17) *
Даже ОС, за которые Вы так горячо пропагандируете, не обходятся без асм-вставок для переключения контекста и т.п.
Они пишутся один раз и разработчиком этой оси, пользователю оси туда соваться не нужно, даже я бы сказать нельзя.
Я же сую ОСь даже в простые проекты, поскольку ОСб - это однажды отлаженный кусок кода, который предварительно скомпилирован в отдельную либу (у меня так).
И дает возможность сразу грамотно спроектировать проект и очень быстро его оживить. А отладка и вылизывание (наведение лоска) - это уже дело десятое.
Если же очень нужно, то ничто не мешает это делать уже после того, как выпущена пробная партий изделий и идет наработка косяков и недочетов.
Т.е. параллельно выполняют две задачи (опять возвращаясь к оси sm.gif, экономится масса времени.


Цитата
Вы не задумывались что этого железа может быть выпущено уже вагон + маленькая тележка? А может уже и у заказчиков многих стоит. sm.gif

Я бы пробовал все варианты, которые только приходят в голову и не только в коде, но и копнул железо, а то может оказаться, что железо вообще никуда не годится wink.gif

Впрочем, мы тут сидим, гадаем, ничего не зная о проекте... sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 23 2016, 10:34
Сообщение #59


Гуру
******

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



Цитата(jcxz @ Jun 23 2016, 16:17) *
Например if (!(db & (0x01 << 12))) { - совершенно лишнее. Нужно убрать, а следующую строку заменить на switch (db & (3 << 9 | 1 << 12)) {.

А ещё лучше заменить switch (db & (3 << 9 | 1 << 12)) { на switch (db >> 9 & (3 | 1 << 12 - 9)) { скорректировав соответствующим образом все case. Судя по листингу это уменьшит кол-во команд.
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 23 2016, 11:15
Сообщение #60


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Цитата(jcxz @ Jun 23 2016, 13:17) *
Например if (!(db & (0x01 << 12))) { - совершенно лишнее. Нужно убрать, а следующую строку заменить на switch (db & (3 << 9 | 1 << 12)) {.

if (!(db & (0x01 << 12))) необходима, чтобы в случае невыполнения условия, как можно быстрее выйти из прерывания.

Цитата(jcxz @ Jun 23 2016, 13:17) *
Операция & 0x1FFF в первой строке тоже совершенно не нужная, генерит две лишних ассемблерных команды.

Да, Вы правы. Осталась после предыдущих версий кода. Сейчас не нужна. Но на сколько я могу судить, компилятор ее проигнорировал (в дизассемблере ее не нашел, обычное считывание регистра). Сейчас и из Си убрал.

Остальное переделал:
CODE
68: {
0x08000240 B410 PUSH {r4}
69: uint_fast16_t db = GPIOC->IDR;
70:
0x08000242 4819 LDR r0,[pc,#100] ; @0x080002A8
0x08000244 8A00 LDRH r0,[r0,#0x10]
71: GPIOB->BSRR = GPIO_BSRR_BS_12;
72:
0x08000246 2101 MOVS r1,#0x01
0x08000248 4A18 LDR r2,[pc,#96] ; @0x080002AC
0x0800024A 0309 LSLS r1,r1,#12
0x0800024C 6191 STR r1,[r2,#0x18]
73: if (!(db & (0x01 << 12))) {
0x0800024E 04C1 LSLS r1,r0,#19
68: {
69: uint_fast16_t db = GPIOC->IDR;
70:
71: GPIOB->BSRR = GPIO_BSRR_BS_12;
72:
73: if (!(db & (0x01 << 12))) {
0x08000250 D424 BMI 0x0800029C
74: switch (db & (0x03 << 9)) {
75: case 0x0000:
0x08000252 2103 MOVS r1,#0x03
0x08000254 0249 LSLS r1,r1,#9
76: GPIOA->BSRR = (0xFF << 16) | (db & 0xFF);
0x08000256 4B16 LDR r3,[pc,#88] ; @0x080002B0
0x08000258 4001 ANDS r1,r1,r0
0x0800025A D008 BEQ 0x0800026E
0x0800025C 39FF SUBS r1,r1,#0xFF
0x0800025E 39FF SUBS r1,r1,#0xFF
0x08000260 1E89 SUBS r1,r1,#2
0x08000262 D00A BEQ 0x0800027A
0x08000264 39FF SUBS r1,r1,#0xFF
0x08000266 39FF SUBS r1,r1,#0xFF
0x08000268 2902 CMP r1,#0x02
0x0800026A D117 BNE 0x0800029C
0x0800026C E00B B 0x08000286
0x0800026E 21FF MOVS r1,#0xFF
0x08000270 B2C0 UXTB r0,r0
0x08000272 0409 LSLS r1,r1,#16
0x08000274 1840 ADDS r0,r0,r1
0x08000276 6198 STR r0,[r3,#0x18]
77: break;
78: case 0x0200:
0x08000278 E010 B 0x0800029C
79: GPIOB->BSRR = (0x03 << 21) | (db & (0x03 << 5));
0x0800027A 2160 MOVS r1,#0x60
0x0800027C 4008 ANDS r0,r0,r1
0x0800027E 0409 LSLS r1,r1,#16
0x08000280 1840 ADDS r0,r0,r1
0x08000282 6190 STR r0,[r2,#0x18]
80: break;
81: case 0x0400:
0x08000284 E00A B 0x0800029C
82: GPIOA->BSRR = (0x0F << 24) | ((db & 0xF0) << 4);
0x08000286 21F0 MOVS r1,#0xF0
0x08000288 4001 ANDS r1,r1,r0
0x0800028A 010C LSLS r4,r1,#4
0x0800028C 210F MOVS r1,#0x0F
0x0800028E 0609 LSLS r1,r1,#24
0x08000290 1864 ADDS r4,r4,r1
0x08000292 619C STR r4,[r3,#0x18]
83: GPIOB->BSRR = (0x0F << 24) | ((db & 0x0F) << 8);
84: break;
85: }
86: }
0x08000294 0700 LSLS r0,r0,#28
0x08000296 0D00 LSRS r0,r0,#20
0x08000298 1840 ADDS r0,r0,r1
0x0800029A 6190 STR r0,[r2,#0x18]
87: EXTI->PR = EXTI_PR_PR8;
0x0800029C 20FF MOVS r0,#0xFF
0x0800029E 4905 LDR r1,[pc,#20] ; @0x080002B4
0x080002A0 3001 ADDS r0,r0,#0x01
0x080002A2 6148 STR r0,[r1,#0x14]
88: }
0x080002A4 BC10 POP {r4}
0x080002A6 4770 BX lr
0x080002A8 0800 DCW 0x0800
0x080002AA 4800 DCW 0x4800
0x080002AC 0400 DCW 0x0400
0x080002AE 4800 DCW 0x4800
0x080002B0 0000 DCW 0x0000
0x080002B2 4800 DCW 0x4800
0x080002B4 0400 DCW 0x0400
0x080002B6 4001 DCW 0x4001


Цитата(jcxz @ Jun 23 2016, 13:17) *
Берёте полученный листинг (лучше сделанный с полной оптимизацией), описание команд Cortex-M0 и разбираетесь.

Сейчас как раз этим и занимаюсь. Не подскажите где посмотреть длительность каждой команды в машинных циклах?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 17:21
Рейтинг@Mail.ru


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