Технический форум по робототехнике.
Dmitry__ » 27 ноя 2012, 16:01
ваууууууу
Когда забрать можно? скока денег?
elmot » 27 ноя 2012, 16:17
забирать-то когда хошь. деньги ща посчитаю.
elmot » 27 ноя 2012, 23:57
Все, больше нету плат.
Dmitry__ » 28 ноя 2012, 03:14
Ждем новых анонсов
Уже подкрутил демку и проверил гир, впечатления положительные, по характеристикам лучше гира в дроне. Пойду флудить в свою тему

Dmitry__ » 04 дек 2012, 21:07
Написал asm поигралку для этой STM32F3-Discovery
Ваши эти армы - рекламная афера, ппц.
поигралку написал по мотивам SysTick_Example
Размер оригинала:
- Код: Выделить всё • Развернуть
1 746 bytes of readonly code memory
90 bytes of readonly data memory
1 080 bytes of readwrite data memory
поигралка:
- Код: Выделить всё • Развернуть
832 bytes of readonly code memory
40 bytes of readwrite data memory
Стмовский CMSIS - быдлокод полнейший.
Работа с GPIO:
настройка пина: 376 тактов
установка пина: 16 тактов
инверсия пина:19 тактов
Это avr на 8 мгц.

Если управлять GPIO из асм методом "Bit Banding" (CMSIS не имеет этого), то на частоте 72 МГц выполнит их за 80 нс. по нынешним временам - медленно. Простая 10 мипсовая пикина делает это за 100 нс. 40 мипсовая PIC33f за 25 нс.
Неоторым программерам "Bit Banding" вынесет мозг, тогда остается стандартный способ установки бит, а это > 180 нс.

dccharacter » 04 дек 2012, 23:31
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BSRRL = GPIO_Pin;
}
????????????????
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
GPIOx->ODR ^= GPIO_Pin;
}
???????????????
???????????????
А еще можно DMA использовать, чтобы ногами дергать.
elmot » 04 дек 2012, 23:32
при правильно заданных опциях ассерт превращается в ничто.
Dmitry__ » 04 дек 2012, 23:44
они выкл. по умолчанию.
dccharacter » 04 дек 2012, 23:45
Ну а так чего? Прямая работа с регистрами, чем тебе цмсис не угодил?
Dmitry__ » 04 дек 2012, 23:50
а ты сделай и пройдись дебагером

Самый быстрый "Bit Banding" это три 16-битных инструкции, примерно 6 тактов.
dccharacter » 04 дек 2012, 23:51
Я не умею
Почему вот это "плохой" битбанг: GPIOx->BSRRL = GPIO_Pin; ???
Dmitry__ » 05 дек 2012, 00:06
dccharacter писал(а):Почему вот это "плохой" битбанг: GPIOx->BSRRL = GPIO_Pin; ???
это компилится в:
- Код: Выделить всё • Развернуть
0x80002bc: 0x490c LDR.N R1, ??DataTable13 ; GPIO_PORT
0x80002be: 0xf20f 0x0234 ADR.W R2, GPIO_PIN ; 0x1000200 (16777728)
0x80002c2: 0xf851 0x1020 LDR.W R1, [R1, R0, LSL #2]
0x80002c6: 0xf832 0x0010 LDRH.W R0, [R2, R0, LSL #1]
0x80002ca: 0x6188 STR R0, [R1, #0x18]
;In section .text, align 4, keep-with-next
;??DataTable13:
0x........ DC32 GPIO_PORT
Т.е чтоб установить пин, надо потратить 20 байт и 8 тактов

elmot » 05 дек 2012, 00:26
а если оптимизацию включить?
Кста, я не совсем прав - cmsis это не только стартовалка. В то же время - рассматриваемый код - это все-таки Std Periph Lib.
Dmitry__ » 05 дек 2012, 00:28
опс, это с указателем на светодиод.
Если просто установить бит, то:
- Код: Выделить всё • Развернуть
GPIOB->BSRR |= 0x00000001;
0x80001e6: 0x4828 LDR.N R0, ??DataTable3_3 ; GPIOB_BSRR.BR0
0x80001e8: 0x6801 LDR R1, [R0]
0x80001ea: 0xf041 0x0101 ORR.W R1, R1, #1
0x80001ee: 0x6001 STR R1, [R0]
\??DataTable3_3:
\ 00000000 0x48000418 DC32 0x48000418
14 байт, 6 тактов
dccharacter » 05 дек 2012, 00:31
А тут (я не понимаю):
GPIO_SetBits:
08000ef4: push {r7}
08000ef6: sub sp, #12
08000ef8: add r7, sp, #0
08000efa: str r0, [r7, #4]
08000efc: mov r3, r1
08000efe: strh r3, [r7, #2]
364 GPIOx->BSRR = GPIO_Pin;
08000f00: ldrh r2, [r7, #2]
08000f02: ldr r3, [r7, #4]
08000f04: str r2, [r3, #16]
365 }
08000f06: add.w r7, r7, #12
08000f0a: mov sp, r7
08000f0c: pop {r7}
08000f0e: bx lr
375 {
GPIO_ResetBits:
08000f10: push {r7}
08000f12: sub sp, #12
08000f14: add r7, sp, #0
08000f16: str r0, [r7, #4]
08000f18: mov r3, r1
08000f1a: strh r3, [r7, #2]
380 GPIOx->BRR =