24.06.2015, 17:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,475
Сказал спасибо: 693
Сказали Спасибо 4,261 раз(а) в 1,955 сообщении(ях)
|
Знатокам Keil C51
Перевожу проект на другой LCD. Для этого создал второй проект - копию исходного, в котором и правлю.
Имею.
Абсолютно одинаковый код софтового SPI транслируется в разный ассемблерный.
Код:
|
//lS020:
void SendData(WORD wrd){
BYTE i;
Cs = 0;
for (i = 16; i › 0; i--)
{
Dat = wrd & 0x8000;
Clk = 0;
Clk = 1;
wrd = wrd‹‹1;
}
Cs = 1;
}
47: void SendData(WORD wrd){
48: BYTE i;
49: Cs = 0;
C:0x3A7B C2A2 CLR PC2(0xA0.2)
51: for (i = 16; i › 0; i--)
C:0x3A7D 7D10 MOV R5,#0x10
52: {
53: Dat = wrd & 0x8000;
C:0x3A7F EE MOV A,R6
C:0x3A80 33 RLC A
C:0x3A81 92A4 MOV PC4(0xA0.4),C
54: Clk = 0;
C:0x3A83 C2A3 CLR PC3(0xA0.3)
55: Clk = 1;
C:0x3A85 D2A3 SETB PC3(0xA0.3)
56: wrd = wrd‹‹1;
C:0x3A87 EF MOV A,R7
C:0x3A88 25E0 ADD A,ACC(0xE0)
C:0x3A8A FF MOV R7,A
C:0x3A8B EE MOV A,R6
C:0x3A8C 33 RLC A
C:0x3A8D FE MOV R6,A
57: }
C:0x3A8E DDEF DJNZ R5,C:3A7F
58: Cs = 1;
C:0x3A90 D2A2 SETB PC2(0xA0.2)
59: }
C:0x3A92 22 RET |
Другой дисплей
Код:
|
//ILI9341:
void TFT_SendData(WORD wrd){
BYTE i;
Rs = 1;
for (i = 16; i › 0; i--)
{
Dat = wrd & 0x8000;
Clk = 0;
Clk = 1;
wrd = wrd‹‹1;
}
}
55: void TFT_SendData(WORD wrd){
56: BYTE i;
57: Rs = 1;
C:0x3AB5 D284 SETB PA4(0x80.4)
58: for (i = 16; i › 0; i--)
C:0x3AB7 7D10 MOV R5,#0x10
59: {
60: Dat = wrd & 0x8000;
C:0x3AB9 EE MOV A,R6
61: Clk = 0;
62: Clk = 1;
63: wrd = wrd‹‹1;
C:0x3ABA 123578 LCALL L?0081(C:3578)
C:0x3ABD EE MOV A,R6
C:0x3ABE 33 RLC A
C:0x3ABF FE MOV R6,A
64: }
C:0x3AC0 DDF7 DJNZ R5,C:3AB9
66: }
C:0x3AC2 22 RET
C:0x3578 33 RLC A
C:0x3579 9285 MOV PA5(0x80.5),C
C:0x357B C286 CLR PA6(0x80.6)
C:0x357D D286 SETB PA6(0x80.6)
C:0x357F EF MOV A,R7
C:0x3580 25E0 ADD A,ACC(0xE0)
C:0x3582 FF MOV R7,A
C:0x3583 22 RET |
Непонятно с какого перепугу, компилятор во втором случае решил оформить ногодрыг и сдвиг переменной
Код:
|
Clk = 0;
Clk = 1;
wrd = wrd‹‹1; |
в виде отдельной подпрограммы. И как его убедить действовать по первому образцу, т.к. операция очень время-критичная и я теряю на этом 30% скорости.
Настройки проектов абсолютно одинаковы.
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
Последний раз редактировалось Kabron; 24.06.2015 в 17:45.
|
|
|
|
24.06.2015, 18:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,726
Сказал спасибо: 2,410
Сказали Спасибо 894 раз(а) в 581 сообщении(ях)
|
Re: ? Знатокам Keil C51 ?
А,если поменять местами исходные файлы ?
|
|
|
|
24.06.2015, 18:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,329
Сказал спасибо: 85
Сказали Спасибо 595 раз(а) в 361 сообщении(ях)
|
Re: ? Знатокам Keil C51 ?
Сообщение от Kabron
|
Непонятно с какого перепугу, компилятор во втором случае решил оформить ногодрыг и сдвиг переменной
в виде отдельной подпрограммы.
|
Оптимизатор, видимо, сработал.
Cs и Rs все же разные в обоих случаях, на разных портах, в разные состояния приводятся, вот и код разный.
С полность отключенной оптимизацией (уровень 0) код, скорее всего, должен стать похожим.
|
|
|
|
24.06.2015, 18:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: ? Знатокам Keil C51 ?
Оформить ассемблерной вставкой... Тоже мне проблема
|
|
|
|
24.06.2015, 19:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,475
Сказал спасибо: 693
Сказали Спасибо 4,261 раз(а) в 1,955 сообщении(ях)
|
Re: ? Знатокам Keil C51 ?
Сообщение от niXto
|
Оформить ассемблерной вставкой... Тоже мне проблема
|
Как раз не проблема, но:
1. хочется понять глюк С какого такого перепугу
2. асмовые вставки требуюn доп настроек компилятора о которых можно потом забыть
3. Да и не кошерно как то
Вот так работает на нужной скорости:
Код:
|
void TFT_SendData(WORD wrd){
Rs=1;
#pragma asm
MOV R5, #0x10 ; for (i = 16; i › 0; i--){
Loop: MOV A,R6
RLC A
MOV 0x80.5, C ; PA5
CLR 0x80.6 ; PA6
SETB 0x80.6 ; PA6
MOV A,R7 ; wrd = wrd‹‹1;
ADD A, ACC ;
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DJNZ R5, Loop
RET
#pragma endasm
} |
Но осадочек...
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
Последний раз редактировалось Kabron; 24.06.2015 в 19:15.
|
|
|
|
24.06.2015, 19:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,475
Сказал спасибо: 693
Сказали Спасибо 4,261 раз(а) в 1,955 сообщении(ях)
|
Re: ? Знатокам Keil C51 ?
Сообщение от baiderin
|
А,если поменять местами исходные файлы?
|
Не помогает, даже хуже
Т.е я не менял именно местами, а добавил в старый проект новый код. Теперь обе функции компилятся с избыточным кодом.
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
|
|
|
|
24.06.2015, 19:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,475
Сказал спасибо: 693
Сказали Спасибо 4,261 раз(а) в 1,955 сообщении(ях)
|
Re: ? Знатокам Keil C51 ?
Сообщение от pambaru
|
Оптимизатор, видимо, сработал.
Cs и Rs все же разные в обоих случаях, на разных портах, в разные состояния приводятся, вот и код разный.
С полность отключенной оптимизацией (уровень 0) код, скорее всего, должен стать похожим
|
С дефолтной оптимизацией я вылетаю в out of space.
В общем грустно, я был лучшего мнения о Кейле, тем более что в knowledge base, разные гуру, на похожий вопрос пишут, что лучше компайлера ни один прогер асм не сделает.
ЗЫ хорошо хоть не заразно Вернул старый обратно, нормально скомпилилось.
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
Последний раз редактировалось Kabron; 24.06.2015 в 19:37.
|
|
|
|
24.06.2015, 19:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: ? Знатокам Keil C51 ?
Уж если биться за скорострельность, то надо писать так
PHP код:
|
#pragma asm
MOV R5, #0x8
MOV A,R6
loop1: RLC A
MOV 0x80.5, C ; PA5
CLR 0x80.6 ; PA6
SETB 0x80.6 ; PA6
DJNZ R5, Loop1
MOV R5, #0x8
MOV A,R7
loop2: RLC A
MOV 0x80.5, C ; PA5
CLR 0x80.6 ; PA6
SETB 0x80.6 ; PA6
DJNZ R5, Loop2
RET
|
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
24.06.2015, 19:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,475
Сказал спасибо: 693
Сказали Спасибо 4,261 раз(а) в 1,955 сообщении(ях)
|
Re: ? Знатокам Keil C51 ?
Boba_spb,
Вау, респект, как сам не додумался прирост в два раза. SPI clock 1.2MHz.
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
Последний раз редактировалось Kabron; 24.06.2015 в 20:01.
|
|
|
|
24.06.2015, 20:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,475
Сказал спасибо: 693
Сказали Спасибо 4,261 раз(а) в 1,955 сообщении(ях)
|
Re: ? Знатокам Keil C51 ?
В общем, пришлось сделать отдельный asm.с с этой функцией, ибо включение asm в файл с драйвером, безбожно портит отладку, т.к. теперь шагание идет только асмовом файле src по ассемблерному коду.
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:50.
|
|