Нет, хайтека не имеем. Уже давно. Перешёл на XC8.botchin писал(а):А если вас не затрудняет и имеете 9,71 - проиграйте.
Програмирование pic на СИ.
- Реклама
Ну, я написал то, что наблюдал, делал и т.д. Уверяю вас, указатели могут иметь разнъе размеръ в HI-TECH 9-71a. И для меня ето бъло непонятно.
Если кто-то попробует - пусть напишет.
Если кто-то попробует - пусть напишет.
Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Попробовал XC8. Да, действительно 
Кот:
Дизасм :
Очевидно, что для s3 используется 2 байта под адрес.
Причём, если убрать АСМ-вставку - используется 1 байт
Добавлено after 5 minutes 18 seconds:
Шайтанамэ
Кот:
Код: Выделить всё
#include <xc.h>
char *s1,*s2,*s3, ss [10];
void main(void){
s1 = ss ;
s2 = ss ;
s3 = ss ;
#asm
movlw _s3
#endasm
*s2=10;
*s3=10;
while(1);
}
Код: Выделить всё
1: #include <xc.h>
2:
3: char *s1,*s2,*s3, ss [10];
4:
5: void main(void){
07ED 3070 MOVLW 0x70
6: s1 = ss ;
7: s2 = ss ;
07EE 00FC MOVWF s2
8: s3 = ss ;
07EF 3070 MOVLW 0x70
07F0 00FA MOVWF s3
07F1 3000 MOVLW 0
07F2 00FB MOVWF 0x7b
9:
10: #asm
11: movlw _s3
07F3 307A MOVLW 0x7a
12: #endasm
13:
14: *s2=10;
07F4 087C MOVF s2, W
07F5 0086 MOVWF FSR1L
07F6 300A MOVLW 0xa
07F7 0187 CLRF FSR1H
07F8 0081 MOVWF INDF1
15: *s3=10;
07F9 087A MOVF s3, W
07FA 0086 MOVWF FSR1L
07FB 087B MOVF 0x7b, W
07FC 0087 MOVWF FSR1H
07FD 300A MOVLW 0xa
07FE 0081 MOVWF INDF1
16:
17: while(1);
07FF 2FFF GOTO 0x7ff
Причём, если убрать АСМ-вставку - используется 1 байт
Добавлено after 5 minutes 18 seconds:
Шайтанамэ
Я подумал, что хорошо будеть, если знаем об етой особености.
И как решают когда 1 байт и когда 2?
Да еще и не дали програмисту возможность указать каким бъть указателя!!!!
И как решают когда 1 байт и когда 2?
Да еще и не дали програмисту возможность указать каким бъть указателя!!!!
Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Меня вот ещё что смущает.
До этого момента, в аккумуляторе находится значение 0x70, зачем его ещё раз туда загонять ?
И для очистки 0x7B - две команды, вместо одной.
Вот тебе и PRO-оптимизация
Старый добрый хайтек STD-версий и то оптимизировал лучше.
Код: Выделить всё
07EF 3070 MOVLW 0x70
07F0 00FA MOVWF s3
07F1 3000 MOVLW 0
07F2 00FB MOVWF 0x7b
И для очистки 0x7B - две команды, вместо одной.
Вот тебе и PRO-оптимизация
Старый добрый хайтек STD-версий и то оптимизировал лучше.
- Реклама
Ето "не PRO" програмер сделает одной командой, а "PRO" двумя.
Лично я видел одно умножение на 1,2 (НДС) расписанное на 22 (двадцать две) страниц кода. А програмер написавшии ето бъл хорошим програмером.
Лично я видел одно умножение на 1,2 (НДС) расписанное на 22 (двадцать две) страниц кода. А програмер написавшии ето бъл хорошим програмером.
Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Доброго дня, коты!
Спаял я себе испытательный стенд на базе 18F14K50 в виде платы с МК, так называемым дисплеем от Nokia 3310 (который конечно же им не является), энкодер, фоторезистор и прочая мелочевка. В МК сидит загрузчик, соответственно прошивку гружу прямо с USB со смещением 0х1000. Все работает, дисплей рисуется, энкодер декодится, кнопки нажимаются.
Для чего мне это всё? Просто отработать некоторые навыки и получить алгоритмы, которые помогут и в дальнейшем послужить готовыми кусками, ну и в плане дальнейшего изучения Си.
Вот, например, хочется мне выводить на экран показания фоторезистора в какой-то определенной позиции, данные от ИК диода в другой и т.д. Графику умным образом порисовать. И хочется освоить структуры, юнионы. Как вы думаете, логично ли использовать их для задания знакоместа, координат, для индикации освещенности в виде прогресс-бара? Я пока только собираюсь это расписывать в виде кода и не хочется сразу попасть в тупиковую ветвь.
Спасибо!
Спаял я себе испытательный стенд на базе 18F14K50 в виде платы с МК, так называемым дисплеем от Nokia 3310 (который конечно же им не является), энкодер, фоторезистор и прочая мелочевка. В МК сидит загрузчик, соответственно прошивку гружу прямо с USB со смещением 0х1000. Все работает, дисплей рисуется, энкодер декодится, кнопки нажимаются.
Для чего мне это всё? Просто отработать некоторые навыки и получить алгоритмы, которые помогут и в дальнейшем послужить готовыми кусками, ну и в плане дальнейшего изучения Си.
Вот, например, хочется мне выводить на экран показания фоторезистора в какой-то определенной позиции, данные от ИК диода в другой и т.д. Графику умным образом порисовать. И хочется освоить структуры, юнионы. Как вы думаете, логично ли использовать их для задания знакоместа, координат, для индикации освещенности в виде прогресс-бара? Я пока только собираюсь это расписывать в виде кода и не хочется сразу попасть в тупиковую ветвь.
Спасибо!
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Задача вывода на дисплей любой информации на самом деле универсальная в плане освоения, так что годится.
Я вот например встроенным отладчиком не пользуюсь, если подключен дисплей - всё что меня интересует вывожу на него.
Я вот например встроенным отладчиком не пользуюсь, если подключен дисплей - всё что меня интересует вывожу на него.
struct и union удобно использовать там, где имеются данные разных форматов, но относящихся к одному программному объекту и/или области памяти.Zhuk72 писал(а):хочется освоить структуры, юнионы. Как вы думаете, логично ли использовать их для ....
То есть на самом деле имеет место быть лишь улучшение читабельности кода, а не получение неких новых его свойств.
Именно это и интересует, т.к. расписать код длиной с портянку могу и без структур (что, собственно говоря, и делаю пока). Но хочется извращенной компактностиКРАМ писал(а):То есть на самом деле имеет место быть лишь улучшение читабельности кода, а не получение неких новых его свойств.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Ещё, плюс объединений переменных в структуры - обработка в функциях. Можно передавать указатель, как аргумент, вместо кучи переменных.
а еще плюс структур и объединений в том, что при использовании качественных IDE требуется помнить меньше имен переменных, т.к. IDE подсказывает их. например, если вы для своего проекта храните какие-то параметры в 10 переменных, вы сами должны помнить их имена, чтобы в нужных местах использовать. если же все они объединены в структуру, предположим, с названием config, то помнить вам надо только это имя, а поля структуры вам подскажет IDE сразу же после того, как введете точку (или стрелочку, если через указатель) после этого имени 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ну да. Остаётся только поработать стрелочками и нажать энтер 
Лень - двигатель прогресса
Лень - двигатель прогресса
Кстати да, я заметил это, когда использовал STATUSbits, сразу после точки мплаб предлагает список.ARV писал(а):а еще плюс структур и объединений в том, что при использовании качественных IDE требуется помнить меньше имен переменных, т.к. IDE подсказывает их.
Стало быть и с пользовательскими объединениями так же будет? Надо заюзать, спасибо, хорошая наводка!
Добавлено after 8 minutes 50 seconds:
Попробовал, мне понравилось
Еще раз спасибо!
Добавлено after 27 minutes 21 second:
Однако поторопился я, не все так просто и радужно, т.к. компиляция не прошла.
В хелпе на ХС8 написано, что структуры не поддерживают тип bit, возможно только использование битовых полей. Углубляюсь в чтение.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Поле можно сделать любого размера, хоть 1 бит, хоть 5, хоть 25 ....
если вас не прижмет реальность так сильно, что невозможно будет обойтись без НЕСТАНДАРТНЫХ типов для Си, - никогда их не используйте! bit - это нестандартный тип, в Си его не существует.Zhuk72 писал(а):структуры не поддерживают тип bit
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Можно, но такое struct leds {unsigned char cnt, pause; bit flash;}; написание он не воспринимает. Говорит, что "taking sizeof bit is illegal".Аlex писал(а):Поле можно сделать любого размера, хоть 1 бит, хоть 5, хоть 25 ....
В другом проекте сейчас проверил struct pos {unsigned char x, y;}; у которого только байты.
На это объявление он смотрит благосклонно, а ругается на pos.x = 0 b pos.y = 0:
ХС8 в качестве примера приводит такое написание:main.c:30: error: (192) undefined identifier "pos"
main.c:30: error: (196) struct/union required
И в примечании указывает, что "Accessing bit-fields larger than a single bit can be very inefficient", что вполне логично.struct {
unsigned lo : 1;
unsigned dummy : 6;
unsigned hi : 1;
} foo;
Так что я наверное буду в таких структурах объявлять только битовые флаги.
Я в курсе этого. Но тем не менее жить без них не могуARV писал(а):bit - это нестандартный тип, в Си его не существует.
В Keil приходится обходится без него, но ХС8 с ним в ладах, потому и использую.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 353
- Зарегистрирован: Вс янв 19, 2014 22:41:55
При прочих равных, union использовать кроме как для получения разных представлений для одних и тех-же данных я бы не рекомендовал. Проблема в неявности модификации - когда структуроподобные вызовы u.f1 = 1; и u.f2 = 2; выглядят как модификация разных полей, но на самом деле меняют одни и те-же данные. Если объёмы памяти позволяют - всему должно быть своё место. Даже если оригинальный автор и оптимизировал таким образом свою программу твёрдо зная что данные в union-е не пересекаются по времени - нет никакой гарантии, что в будущем тот-же автор не отрефакторит своё творение и данные пересекутся - подарив ему возможность провести "выходные в отладчике". А уж что и говорить за тех, кто будет рефакторить после него - уж они-то точно не преминут откопать эти грабли.Zhuk72 писал(а):Стало быть и с пользовательскими объединениями так же будет? Надо заюзать, спасибо, хорошая наводка!
bit - в печку. Про битовые поля имейте ввиду, что под структуру будет выделено целое число байт даже если задействован один бит:Zhuk72 писал(а):В хелпе на ХС8 написано, что структуры не поддерживают тип bit, возможно только использование битовых полей.
Код: Выделить всё
struct iS { int i : 1; } // sizeof(iS) == sizeof(int)
struct cS { char i : 1; } // sizeof(cS) == sizeof(char)
Добавлено after 9 minutes 26 seconds:
pos это не переменная, и даже не тип (в С) - а именно что НеизвестнАЯ ИдентификАтыръ.Zhuk72 писал(а):main.c:30: error: (192) undefined identifier "pos"
Кстати, компилятор склеивает глобальные переменные типа bit в несколько более заметные для линкера сущности. Т.е. обращение с ними несёт такие-же накладные расходы как и с битовыми полями.Zhuk72 писал(а):Я в курсе этого. Но тем не менее жить без них не могу
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
Это я знаю. В принципе если я объявляю bit start1, stop2, wait254, imho323; то в итоге компилятор размещает их в одном байте. Идея объединить их в структур только для того, чтобы помочь склерозу, т.к. иной раз приходится лезть в объявления, чтобы вспомнить имя переменной.Siarzhuk писал(а):bit - в печку. Про битовые поля имейте ввиду, что под структуру будет выделено целое число байт даже если задействован один бит
Ну об этом я писал, вернее цитировал, выше. Но это в случае большего, чем 1, размера поля.Siarzhuk писал(а): Ну и помните, что при оптимизации битовыми полями сегмента данных - страдает сегмент кода (читай производительность), за счёт большего количества операций по доступу к полям. Мало того - в зависимости от позиции битового поля в структуре - размер операций тоже может быть разным.
В случае однобитого поля код скомпилируется в обычные bsf/bcf и btfss/btfsc.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
это на самом деле так? не 1 байт?Siarzhuk писал(а):struct iS { int i : 1; } // sizeof(iS) == sizeof(int)
скорее всего он задействует для этой цели аппаратные фичи кристалла. про PIC не скажу, а в MCS51 есть особые области ОЗУ с побитовой адресацией, и соответствующие однобитовые команды ассемблера. так что и тут речь скорее всего об этом - линкер отдыхает.Siarzhuk писал(а):Кстати, компилятор склеивает глобальные переменные типа bit в несколько более заметные для линкера сущности. Т.е. обращение с ними несёт такие-же накладные расходы как и с битовыми полями.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


