Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Re: Вопросы по С/С++ (СИ)

Сообщение slavokhire5 »

paskal писал(а):В исходной программе использовалось очень много битовых флагов. Позволяет ли Си пользоваться битовыми флагами. То есть чтоб на 1 флаг тратился бит, а не байт?
Вот пример работы с битами:

Код: Выделить всё


#define F_RED	0x01
#define F_GREEN	0x02
#define F_BLUE	0x04

volatile uint8_t flags;

void main ()	
{
	flags |= F_RED;			// set flag "red". now flags == 0x01

	// do something
	flags |= F_BLUE;		// set flag "blue". now flags == 0x05
	
	// do something
	flags &= ~RED;			// reset flag "red". now flags == 0x04
}
Еще можно работать через битовые поля, но я этим как-то не пользуюсь
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Реклама
Аватара пользователя
paskal
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пн сен 05, 2011 10:03:06
Откуда: Тула

Re: Вопросы по С/С++ (СИ)

Сообщение paskal »

slavokhire5 писал(а):Еще можно работать через битовые поля, но я этим как-то не пользуюсь
Так интересуют как раз битовые поля.
Дело в том что в исходной программе аж несколько десятков битовых переменных. Если реализовывать их арифметикой, то получится такая каша... Тогда получается что на ассемблере удобнее чем на сях.
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
Реклама
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Re: Вопросы по С/С++ (СИ)

Сообщение ks0 »

paskal писал(а):
slavokhire5 писал(а):Еще можно работать через битовые поля, но я этим как-то не пользуюсь
Так интересуют как раз битовые поля.
Так они гуглятся http://www.c-cpp.ru/books/bitovye-polya
В структурах можно использовать
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18648
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Разве у этого МК нет специального регистра, биты которого сигнализируют о том, что сброс был по подаче питания? По-моему, есть...и извращения с сигнатурами будут лишними.

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

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
paskal
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пн сен 05, 2011 10:03:06
Откуда: Тула

Re: Вопросы по С/С++ (СИ)

Сообщение paskal »

ks0 писал(а):Так они гуглятся http://www.c-cpp.ru/books/bitovye-polya
В структурах можно использовать
Эээ... в 51-х контроллерах битовые поля это такая область памяти с адреса 20h где имеется аппаратный доступ к отдельным битам по адресу бита, без двоичной арифметики.
Но насчет гугля вы правы. Вот я нашел ответ: http://onembedding.bialix.com/tools/keil/faq/#sbit
Так что этот вопрос снят.
ARV писал(а):Разве у этого МК нет специального регистра, биты которого сигнализируют о том, что сброс был по подаче питания? По-моему, есть...и извращения с сигнатурами будут лишними.
Ну если честно то я бы с удовольствием отказался бы от сигнатур. Но я такого регистра у at89s52 не знаю.
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
Реклама
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Re: Вопросы по С/С++ (СИ)

Сообщение ks0 »

Ну я не знаю какие там еще могут быть особенности, но в Си если переменную определить, но не присвоить ей значение, то никакого обнуления ее не будет. Т.е. это должно работать

Код: Выделить всё

int n;
if(n==0x8888) 
{ 
   /* был вызыван reset */ 
}
else 
{
   /* было отключение питания */
   n=0x8888;
}
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18648
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

paskal писал(а):
ARV писал(а):Разве у этого МК нет специального регистра, биты которого сигнализируют о том, что сброс был по подаче питания? По-моему, есть...и извращения с сигнатурами будут лишними.
Ну если честно то я бы с удовольствием отказался бы от сигнатур. Но я такого регистра у at89s52 не знаю.
это очень плохо, что вы беретесь программировать МК, не изучив его внутреннее устройство. изучайте регистр PCON и конкретно флаг (бит) этого регистра POF
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18648
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

ks0 писал(а):Ну я не знаю какие там еще могут быть особенности, но в Си если переменную определить, но не присвоить ей значение, то никакого обнуления ее не будет.
верно только для локальных не статических переменных функций. глобальные (статические) переменные по умолчанию обнуляются.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: Вопросы по С/С++ (СИ)

Сообщение Rtmip »

paskal писал(а):Помогите справиться с особенностями кейла... МК - AT89S52... В некоторую определенную область ОЗУ пишется определенная сигнатура...Так вот, программа на си при старте заполняет ОЗУ нулями, затирая сигнатуру. Как у Кейла отключить эту фичу?
При чем тут Кейл? Разве ОЗУ это энергонезависимая память? При старте там будет, что угодно, включая старые остатки знаний. Вообщем при старте содержимое ОЗУ теряется, а регистры, за исключением SP=7 обнуляются. Может неверно понята логика работы программы?
ARV верно подсказывает про PCON.
Аватара пользователя
paskal
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пн сен 05, 2011 10:03:06
Откуда: Тула

Re: Вопросы по С/С++ (СИ)

Сообщение paskal »

ARV писал(а): изучайте регистр PCON и конкретно флаг (бит) этого регистра POF
Отлично! Вопрос с памятью тоже снят! :))
Rtmip писал(а):При чем тут Кейл? Разве ОЗУ это энергонезависимая память? При старте там будет, что угодно, включая старые остатки знаний.
Компилятор вставляет в начало программы такой код:

Код: Выделить всё

                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
И делает так даже при голой сишной программе. Уговорить его чтоб он так не делал, я не смог.
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

Грызите доку на компилятор... там должно быть что-то типа noinit... не инициализировать...
"Я не даю готовых решений, я заставляю думать!"(С)
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: Вопросы по С/С++ (СИ)

Сообщение Rtmip »

paskal писал(а):Компилятор вставляет в начало программы такой код:

Код: Выделить всё

                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
И делает так даже при голой сишной программе. Уговорить его чтоб он так не делал, я не смог.
Я понял Вас, но Вы меня нет. Это хорошо, что он так делает,
встречал даже где-то вопрос, как так делать. Но раз хозяин барин, то либо не используйте в проекте файл "STARTUP.A51" - то есть при создании откажитесь от него,
либо создайте копию и пропишите в ней, то, что хотите :)
Аватара пользователя
paskal
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пн сен 05, 2011 10:03:06
Откуда: Тула

Re: Вопросы по С/С++ (СИ)

Сообщение paskal »

Rtmip писал(а):Я понял Вас, но Вы меня нет. Это хорошо, что он так делает,
встречал даже где-то вопрос, как так делать. Но раз хозяин барин, то либо не используйте в проекте файл "STARTUP.A51"
Это вы меня не поняли. Я отказывался от ассемблерного стартапа при создании проекта. Проект состоит из голого сишного файла. При этом он компилируется в такой код:
Изображение
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: Вопросы по С/С++ (СИ)

Сообщение BorisSPB »

paskal, посмотри эту ссылку http://www.keil.com/support/man/docs/c5 ... varloc.htm.
По-моему это то что тебе надо.
Если все-таки нужный адрес обнуляется, то в стандартном стартапе уменьшить размер сегмента IDATA и разместить сигнатуру по освободившимся адресам.
Последний раз редактировалось BorisSPB Вс окт 12, 2014 22:45:22, всего редактировалось 1 раз.
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: Вопросы по С/С++ (СИ)

Сообщение Rtmip »

paskal писал(а):Это вы меня не поняли.
Хорошо, не получается запустить проект без "стартапа", но что мешает закоментировать в STARTUP.A51 обнуление?
Аватара пользователя
paskal
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пн сен 05, 2011 10:03:06
Откуда: Тула

Re: Вопросы по С/С++ (СИ)

Сообщение paskal »

Rtmip писал(а):Хорошо, не получается запустить проект без "стартапа", но что мешает закоментировать в STARTUP.A51 обнуление?
В принципе можно, но тут выяснилось что есть более легкий путь решения проблемы
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: Вопросы по С/С++ (СИ)

Сообщение BorisSPB »

Так и останется навсегда тайной как paskal решил свою проблему...
kelod
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Re: Вопросы по С/С++ (СИ)

Сообщение kelod »

проблема до безобразия простая, не могу выполнить умножение нескольких целых цисел

Код: Выделить всё

int x=(rt*eeprom_read_byte(&t_og_t[min]))/10;
по отдельности rt = 2198, а eeprom_read_byte(&t_og_t[min])=40, т.е. перемножением должны получить 87920, делим на 10 итого 8792, но вместо этого контроллер почему то выдаёт 2238, т.е. 2198+40=2238 и игнорирует деление
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18648
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

int x=(rt*(long)eeprom_read_byte(&t_og_t[min]))/10L;
или
int x=((long)rt*eeprom_read_byte(&t_og_t[min]))/10L;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
kelod
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Re: Вопросы по С/С++ (СИ)

Сообщение kelod »

а как быть с этим

Код: Выделить всё

r=(rt*eeprom_read_byte(&t_og_t[min])-rt*eeprom_read_byte(&t_og_t[max])+eeprom_read_dword(&t_og_r[min])*eeprom_read_byte(&t_og_t[max])-eeprom_read_dword(&t_og_r[max])*eeprom_read_byte(&t_og_t[min]))*pow((eeprom_read_dword(&t_og_r[min])-eeprom_read_dword(&t_og_r[max])),-1);
написал вот так

Код: Выделить всё

int r=(rt*(long)eeprom_read_byte(&t_og_t[min])-rt*(long)eeprom_read_byte(&t_og_t[max])+(long)eeprom_read_dword(&t_og_r[min])*(long)eeprom_read_byte(&t_og_t[max])-(long)eeprom_read_dword(&t_og_r[max])*(long)eeprom_read_byte(&t_og_t[min]))*pow(((long)eeprom_read_dword(&t_og_r[min])-(long)eeprom_read_dword(&t_og_r[max])),-1);
вроде всё заработало, но в положительной части за исключением варианта, 1459*50-1459*40+973*40-1459*50/(973-1459), вместо 40 получается почему то 33, а при ожидании отрицательных результатов мало того что числа получаются положительные, так ещё и невообразимо большие
Ответить

Вернуться в «Разные вопросы по МК»