|
|
  |
Помогите определиться с камнем, дисплеем и пр. |
|
|
|
Apr 9 2014, 07:48
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Че-то я не понимаю =). камень STM32F103VET6 CODE fsmcTiming.FSMC_AddressSetupTime = 0x00; fsmcTiming.FSMC_AddressHoldTime = 0x00; fsmcTiming.FSMC_DataSetupTime = 0x01; fsmcTiming.FSMC_BusTurnAroundDuration = 0x00; fsmcTiming.FSMC_CLKDivision = 0x01; fsmcTiming.FSMC_DataLatency = 0x00; fsmcTiming.FSMC_AccessMode = FSMC_AccessMode_A; fsmc.FSMC_Bank = FSMC_Bank1_NORSRAM1; fsmc.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; fsmc.FSMC_MemoryType = FSMC_MemoryType_SRAM; fsmc.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; fsmc.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; fsmc.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; fsmc.FSMC_WrapMode = FSMC_WrapMode_Disable; fsmc.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; fsmc.FSMC_WriteOperation = FSMC_WriteOperation_Enable; fsmc.FSMC_WaitSignal = FSMC_WaitSignal_Disable; fsmc.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; fsmc.FSMC_WriteBurst = FSMC_WriteBurst_Disable; fsmc.FSMC_ReadWriteTimingStruct = &fsmcTiming; fsmc.FSMC_WriteTimingStruct = &fsmcTiming; FSMC_NORSRAMInit(&fsmc); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); Такая вот инициализация. Порты на 50МГц. Дисплей 320х240. 12 бит на пиксель. Если кручу в main'е такой код: Код while(1) { for (max=0;max<76800;max++) { *(uint16_t *) (LCD_DATA)=y; } y++; } То частота кадров равна примерно 21 кадр в секунду.Частоту кадров смотрю по осциллографу: на один кадр приходится 1 цвет, и по этому смотрю поведение младшего бита. Он "тикает" с частотой кадров. Если вызываю из прерывания по таймеру (настроен на сколько-то там мегагерц, что бы получить 25гц кадровую), то частота кадров становится еще ниже. Вопрос: это с чего это вдруг так сильно пыжится процессор? Как повысить частоту кадров?
Сообщение отредактировал Lost_Viking - Apr 9 2014, 07:54
|
|
|
|
|
Apr 9 2014, 08:28
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Lost_Viking @ Apr 9 2014, 11:48)  Если вызываю из прерывания по таймеру (настроен на сколько-то там мегагерц, что бы получить 25гц кадровую), то частота кадров становится еще ниже. Сколько-то там - это сколько? И что получится, если разделить частоту ядра на эти мегагерцы? Цитата(Lost_Viking @ Apr 9 2014, 11:48)  Вопрос: это с чего это вдруг так сильно пыжится процессор? Как повысить частоту кадров? Листинг ассемблерный прежде всего посмотрите.
|
|
|
|
|
Apr 9 2014, 09:03
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(aaarrr @ Apr 9 2014, 12:28)  Сколько-то там - это сколько? И что получится, если разделить частоту ядра на эти мегагерцы?  Да я уже не помню сколько там миллионов... 320*240*25 = пикселей/сек . Реально работает не быстрее... около 8.33 кадров в секунду если включать цикл for, и около 10 кадров в секунду, если просто перебирать цвета по каждой точке. Цитата(aaarrr @ Apr 9 2014, 12:28)  Листинг ассемблерный прежде всего посмотрите. Код 554: while(1) 555: { 556: 0x0800142C E016 B 0x0800145C 557: for (max=0;max<76800;max++) 558: { 0x0800142E 2000 MOVS r0,#0x00 0x08001430 4911 LDR r1,[pc,#68]; @0x08001478 0x08001432 6008 STR r0,[r1,#0x00] 0x08001434 E008 B 0x08001448 559: *(uint16_t *) (LCD_DATA)=y; 560: } 0x08001436 4811 LDR r0,[pc,#68]; @0x0800147C 0x08001438 8800 LDRH r0,[r0,#0x00] 0x0800143A 4909 LDR r1,[pc,#36]; @0x08001460 0x0800143C 8008 STRH r0,[r1,#0x00] 0x0800143E 480E LDR r0,[pc,#56]; @0x08001478 0x08001440 6800 LDR r0,[r0,#0x00] 0x08001442 1C40 ADDS r0,r0,#1 0x08001444 490C LDR r1,[pc,#48]; @0x08001478 0x08001446 6008 STR r0,[r1,#0x00] 0x08001448 480B LDR r0,[pc,#44]; @0x08001478 0x0800144A 6800 LDR r0,[r0,#0x00] 0x0800144C F5B03F96 CMP r0,#0x12C00 0x08001450 DBF1 BLT 0x08001436 561: y++; 0x08001452 480A LDR r0,[pc,#40]; @0x0800147C 0x08001454 6800 LDR r0,[r0,#0x00] 0x08001456 1C40 ADDS r0,r0,#1 0x08001458 4908 LDR r1,[pc,#32]; @0x0800147C 0x0800145A 6008 STR r0,[r1,#0x00] Далее идет отсыл по условию while(1) Если работа по прерыванию, то добавляется еще несколько команд. Сброс флага - как минимум одна команда. p.s. кварц на 8МГц, в stm32f10x.h раздевайнена строка для HD линии, и собственно выставлен кварц на 8МГц. p.p.s как я понимаю, процессорное время тратится на выполнение этих команд. Но как же тогда люди добиваются 25 кадров в секунду, при этом проц работает на частоте 72МГц , и разрешенка у них не ниже моей? Или я чего-то упустил в форуме?
Сообщение отредактировал Lost_Viking - Apr 9 2014, 09:08
|
|
|
|
|
Apr 9 2014, 09:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Оптимизацию включите. И добавьте volatile к uint16_t в строке Код *(uint16_t *) (LCD_DATA)=y; Цитата(Lost_Viking @ Apr 9 2014, 13:03)   Да я уже не помню сколько там миллионов... 320*240*25 = пикселей/сек . Много успеет процессор, если у него между прерываниями 72M/(320*240*25)=37.5 тактов?
|
|
|
|
|
Apr 9 2014, 09:50
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(aaarrr @ Apr 9 2014, 13:22)  Оптимизацию включите. И добавьте volatile к uint16_t в строке Код *(uint16_t *) (LCD_DATA)=y; Много успеет процессор, если у него между прерываниями 72M/(320*240*25)=37.5 тактов? Да о том и речь. Или мне показалось, что тут на форуме на 72МГц делали для 320х240 развертку в 25Гц , и даже более ?
|
|
|
|
|
Apr 9 2014, 10:26
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(aaarrr @ Apr 9 2014, 14:11)  Сделать можно, но уж точно не прерываясь на каждый пиксель. Делайте прерывание с периодом строки, в нем загружайте одну строку с максимально допустимой скоростью. Так я и так не использую прерывание . Точки рисую в основном цикле программы . Выше 21 кадра в сек не было . Я понимаю, что работать надо с DMA. Но опять же: скорость обновления информации в памяти будет на уровне 20кадров в сек. А то и меньше, если будут промежуточные расчеты. Как быть?
|
|
|
|
|
Apr 9 2014, 13:21
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(aaarrr @ Apr 9 2014, 15:18)  Оптимизацию включили? Не успел. Завтра гляну.В Keil вроде бы по дефолту стоит оптимизация. Да и что она даст? 1920000 пикселей в сек все равно придется через процессор перелопачивать, а это как минимум 1920000 операций в секунду, не думаю что как-то можно что-то сделать, если , допустим я хочу еще читать данные из ацп, фильтровать их через фильтр ЭСС (а там коэффициент либо вещественный, либо как минимум делается сдвигом ). Как-то печально всё. Не сделать мне хитрый осциллограф-интегратор с фильтром на входе. Ведь хочу еще сетку рисовать. Думал на пиксель использовать два бита. Один бит на сетку (есть/нет), другой - на сигнал (есть/нет). Тогда можно было бы в озу держать буфер размером в 320*2/8 байт на 240*2/8 , то есть 4800 байт. Но фишка в том,что для "декодирования" буфера потребуется как минимум 4 операции сравнения , содержащие в себе хитрые условия. Кажется, что я слишком размечтался  )
Сообщение отредактировал Lost_Viking - Apr 9 2014, 13:39
|
|
|
|
|
Apr 9 2014, 13:56
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(aaarrr @ Apr 9 2014, 17:47)  Не стоит. Эммм..  Ок. Гляну завтра что получится. Спасибо. Но все же не думаю, что смогу реализовать то, что я хочу
|
|
|
|
|
Apr 9 2014, 14:21
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Lost_Viking @ Apr 9 2014, 17:56)  Эммм..  Ок. Гляну завтра что получится. Спасибо. Но все же не думаю, что смогу реализовать то, что я хочу Могу показать сейчас: Код >>> MAIN\#19 while(1) >>> MAIN\#20 { >>> MAIN\#21 for (max=0;max<76800;max++) 00008528 2100 MOVS r1,#0 >>> MAIN\#22 { >>> MAIN\#23 *(volatile uint16_t *) (LCD_DATA)=y; 0000852A 8010 STRH r0,[r2,#0] 0000852C 8010 STRH r0,[r2,#0] --- MAIN\#22 { --- MAIN\#23 *(volatile uint16_t *) (LCD_DATA)=y; 0000852E 1C89 ADDS r1,r1,#2 00008530 F5B13F96 CMP r1,#0x12c00 00008534 D3F9 BCC 0x852a <MAIN\#23> >>> MAIN\#24 } >>> MAIN\#25 y++; 00008536 1C40 ADDS r0,r0,#1 --- MAIN\#24 } --- MAIN\#25 y++; 00008538 B280 UXTH r0,r0 0000853A E7F5 B 0x8528 <MAIN\#21> Сравните длину цикла с предыдущим листингом.
|
|
|
|
|
Apr 9 2014, 14:38
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(aaarrr @ Apr 9 2014, 18:21)  Сравните длину цикла с предыдущим листингом. да Вы волшебник ! =)) Сейчас стоит "Level 0" Как я понимаю, надо повысить уровень. Optimize for Time сделать Что еще посоветуете?
Сообщение отредактировал Lost_Viking - Apr 9 2014, 14:42
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|