Например TDA7294

Форум РадиоКот • Просмотр темы - WinAvr в вопросах и ответах
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пн июл 14, 2025 22:51:53

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2195 ]     ... , , , 96, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн дек 28, 2015 21:32:42 
Первый раз сказал Мяу!

Зарегистрирован: Сб дек 26, 2015 22:28:05
Сообщений: 22
Рейтинг сообщения: 0
Alexeyslav писал(а):
Компилятор не настолько умный чтобы рассматривать все возможные ветви условий, тем более ваша переменная могла быть изменена где-то в коде по пути от инициализации до условия. Да и условие могло быть и посложнее.
Компиляторы такие ситуации не разруливают настолько глубоко, этим занимаются отдельные статические анализаторы кода.
Если хотите чтобы начальное значение Х было равно 5 то так и сделайте. Такая инициализация значением переменной X как у вас сомнительна в плане надёжности, хоть алгоритм и очевиден с первого взгляда. Но не всегда будет так.


В даном примере я с Вами согласен, но в реальном проэкте у меня задача немного сложнее. Вместо X мне нада прочесть с памяти программ значения структур меню. Переменная status - переменная флагов, которая получает своё значение от функции управления Console(), и в другом месте функции не изменяется. В момент входа в функцию func() в переменной флагов устанавливается флаг (в примере бит 1) "флаг изменения уровня" и производится чтение параметров 0-го (корневого) уровня меню. В цикле производится перемищение по пунктам меню текущего уровня (без повторной чтения параметров уровня меню). И только когда возвращается функцией Console() значение с установленным "флагом изменения уровня" производится цтение параметров нового уровня. До этого подобные алгоритмы делал на ассемблере и для того чтобы не дублировать код при начальной инициализации и переходах между уровнями, использовалась установка "флага изменения уровня" при входе в меню. Но в отличии от ассемблера, Си сам выполняет оптимизацию, и на начальных этапах освоения особенностей програмирования на Си, предупреждения подобного рода вызывают сомнения в надёжности такого кода. На ассемблере подобный метод вопросов в плане надёжности не вызывает, и уже проверен в разных устройствах. А вот с Си пытаюсь разобраться, что я делаю не так...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вт дек 29, 2015 07:00:22 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
В отличие от сообщений об ошибках, сообщения-предупреждения служат для привлечения внимания программиста к "подозрительным" местам.
Если вы не имеете аналогичных сообщений в ассемблере, то не потому, что ваш алгоритм безупречен, а потому, что ассемблер не имеет такой функции - обращать внимание на подозрительные места (да и определить такое место в ассемблере - задача та еще и для человека).
Предупреждения вообще можно отключить - будет вам полный аналог поведения ассемблера, и вы сможете спокойно спать.
А можно включить "параноидальный" режим предупреждений, и тогда сами авторы языка Керниган с Ричи вряд ли сумели бы написать код без варнингов :)))

Поэтому увидели варнинг - просмотрите код: если на самом деле компилятор прав - устраняйте проблему, если он "перебдел" - живите спокойно. Как правило, всегда можно устранить варнинг правкой кода, но не всегда это дает реально полезный эффект, если не считать за пользу спокойствие компилятора.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вт дек 29, 2015 10:13:18 
Первый раз сказал Мяу!

Зарегистрирован: Сб дек 26, 2015 22:28:05
Сообщений: 22
Рейтинг сообщения: 0
ARV писал(а):
В отличие от сообщений об ошибках, сообщения-предупреждения служат для привлечения внимания программиста к "подозрительным" местам.
Если вы не имеете аналогичных сообщений в ассемблере, то не потому, что ваш алгоритм безупречен, а потому, что ассемблер не имеет такой функции - обращать внимание на подозрительные места (да и определить такое место в ассемблере - задача та еще и для человека).
Предупреждения вообще можно отключить - будет вам полный аналог поведения ассемблера, и вы сможете спокойно спать.
А можно включить "параноидальный" режим предупреждений, и тогда сами авторы языка Керниган с Ричи вряд ли сумели бы написать код без варнингов :)))

Поэтому увидели варнинг - просмотрите код: если на самом деле компилятор прав - устраняйте проблему, если он "перебдел" - живите спокойно. Как правило, всегда можно устранить варнинг правкой кода, но не всегда это дает реально полезный эффект, если не считать за пользу спокойствие компилятора.


Спасибо за разъяснение, именно в этом и был вопрос. При написании кода на ассемблере пытаешся сделать код максимально компактным и оптимальным с точки зрения расхода "тактов", но вот при попытке подобного подхода в Си иногда стал получать такие предупреждения.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Ср дек 30, 2015 15:43:52 
Первый раз сказал Мяу!

Зарегистрирован: Сб дек 26, 2015 22:28:05
Сообщений: 22
Рейтинг сообщения: 0
Форумчане, прошу совет: надо передать в функцию указатель на значение типа char, при том что параметром функции является указатель на тип int. Реализовал с помощью буфера int, копирую туда значение, вызываю функцию, после чего востанавливаю значение с буфера. Какой подход будет более коректным не изменяя тип значения char?


Вернуться наверх
 
Выбираем индустриальные и медицинские источники питания MEAN WELL в открытом исполнении

Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пт янв 22, 2016 13:47:22 
Встал на лапы

Зарегистрирован: Вс авг 01, 2010 16:05:25
Сообщений: 134
Рейтинг сообщения: 0
Помогите со структурой
Код:
struct teme {

unsigned int ch;
unsigned int vin;
unsigned int mih;
volatile unsigned int eig;
} vremu={10,23,45,0};

void chitaem( time *vremu){ // error: expected ')' before '*' token
vremu.eig=vremu.vin+12;
}

Вот нашёл в своих старых записях, решил применить да что то не выходит пишет ошибку, но раньше компилировалось, кажется.
Помогите связать функцию и структуру?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пт янв 22, 2016 18:13:21 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4884
Откуда: Минск
Рейтинг сообщения: 0
Что такое time и в чём отличие от teme?
Потом, vremu - указатель, поэтому доступ к элементам - либо через (*vremu).ch, либо через vremu->ch.
Поэтому так:
Код:
struct time {
    unsigned int ch;
    unsigned int vin;
    unsigned int mih;
    volatile unsigned int eig;
} vremu = {10,23,45,0};

void chitaem(struct time *vremu) {
    vremu->eig = vremu->vin + 12;
}
либо так:
Код:
typedef struct {
    unsigned int ch;
    unsigned int vin;
    unsigned int mih;
    volatile unsigned int eig;
} time;

time vremu = {10,23,45,0};

void chitaem(time *vremu) {
    vremu->eig = vremu->vin + 12;
}


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб янв 23, 2016 15:08:03 
Встал на лапы

Зарегистрирован: Вс авг 01, 2010 16:05:25
Сообщений: 134
Рейтинг сообщения: 0
Спасибо, это просто набор букв, в котором закралась ошибочка.
А как теперь вызывать эту функцию?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб янв 23, 2016 16:02:45 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4884
Откуда: Минск
Рейтинг сообщения: 0
Как обычно, по имени, передавая в аргументах адрес структуры, в которой надо eig = vin + 12 проделать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб янв 23, 2016 16:44:18 
Встал на лапы

Зарегистрирован: Вс авг 01, 2010 16:05:25
Сообщений: 134
Рейтинг сообщения: 0
Т.е.
Код:
 chitaem(&vremu);


Нет как то это всё мудрёно, я наверно пойду другим путём
Код:
void chitaem (unsigned int* eig,unsigned int* vin){
*eig=*vin+12;
}

Это просто пример.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб янв 23, 2016 17:05:30 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4884
Откуда: Минск
Рейтинг сообщения: 0
Вообще, если это vremu (что за странное название, кстати?) одно, то ничто не мешает эту функцию вообще без параметров сделать.
Ну а если не одно - то красивее получается так:
Код:
typedef struct {
    unsigned int ch;
    unsigned int vin;
    unsigned int mih;
    volatile unsigned int eig;
} time;

time vrem0 = {10,23,45,0};
time vrem1 = {11,24,25,0};
time vrem2 = {12,42,12,0};

void chitaem(time *vr) {
    vr->eig = vr->vin + 12;
}

...
chitaem(&vrem0);
...
chitaem(&vrem1);
...
chitaem(&vrem2);
...

Плюс, если vremu (врему это время?) должно как-то со временем работать, то unsigned int для элементов структуры - это слишком, достатоно и обчного char. Всё-таки на 8бит контроллерах это существенно.

И да, интересно всё же - что скрывается под этими странными именами переменных, странно звучащими в русской транскрипции "врему", "вин", "мих", "еиг"? Просто я, например, когда пишу код, стараюсь какие-то осмысленные имена переменным давать, а тут даже близко непонятно, что это. Интригует, знаете ли.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб янв 23, 2016 17:51:41 
Встал на лапы

Зарегистрирован: Вс авг 01, 2010 16:05:25
Сообщений: 134
Рейтинг сообщения: 0
Да я не могу придумать, какие то подходящие приблизительно по смыслу, ударил по клавиатуре пальцами что получилось то и ладно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб янв 23, 2016 17:56:02 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4884
Откуда: Минск
Рейтинг сообщения: 0
Ага, а потом
TICLIR писал(а):
нашёл в своих старых записях, решил применить да что то не выходит
:)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Чт мар 03, 2016 14:59:57 
Сверлит текстолит когтями

Карма: 12
Рейтинг сообщений: 124
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1213
Рейтинг сообщения: 0
Вопрос к ARV. хотя, и не только.))
Нужна быстрая реакция на прерывание. И хотелось что бы вся задача крутилась в прерывании.
Но, т.к. в задаче имеются функции, будет увеличен и пролог, что крайне нежелательно.
Собственно вопрос. Возможно ли что бы прологом/эпилогом были оформлены уже сами функции?
Т.е., что бы этот огромный пролог располагался не с самого начала обработчика?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Чт мар 03, 2016 17:15:33 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 209
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1520
Рейтинг сообщения: 0
Зачем крутить задачу в прерывании? Они не для этого предназначены а для быстрой реакции на внешние события.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Чт мар 03, 2016 18:40:07 
Друг Кота
Аватар пользователя

Карма: 45
Рейтинг сообщений: 623
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Сообщений: 8007
Откуда: Лукалэнд
Рейтинг сообщения: 0
Взаимоисключающие параграфы. Быстрой реакции на прерывания при раздутом прерывании не будет. Если только при условии разрешения вложенных прерываний.... и потом разгребать непонятно как работающий индусский код.
В прерывании надо быстро, как пуля, среагировать и вылететь из него. Остальное, что нужно доделать - в основном коде. Если успользуются функции в прерывании - инлайнить их в прерывание.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Чт мар 03, 2016 19:06:37 
Сверлит текстолит когтями

Карма: 12
Рейтинг сообщений: 124
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1213
Рейтинг сообщения: 0
Согласен, не красиво. Но хотелось бы ещё чего то полезного поделать...
А тогда не получается быстро обрабатывать данные получаемые в прерывании...((


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Чт мар 03, 2016 19:22:55 
Друг Кота
Аватар пользователя

Карма: 45
Рейтинг сообщений: 623
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Сообщений: 8007
Откуда: Лукалэнд
Рейтинг сообщения: 0
А их там надо быстро обрабатывать? Обычно данные надо быстро получить, а разгребать можно потом. Не часто требуется на лету обрабатывать.
В общем, мало исходных данных. Точнее, их совсем нет. Что за данные, что с ними делать..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пт мар 04, 2016 13:57:08 
Сверлит текстолит когтями

Карма: 12
Рейтинг сообщений: 124
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1213
Рейтинг сообщения: 0
А нет ли возможности принудительно запретить формирование пролога?
Т.е., что бы функции брали на себя эту заботу. Либо "не светить" функции в ISR, что аналогично?
Инлайн, как я понимаю, не гарантирует инлайн на 100%?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пт мар 04, 2016 18:31:53 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
И разрушить работу всей программы?
Компилятор лучше знает что туда добавлять и если у него не будет повода туда что-то добавлять(код на ассемблере, например), то ничего и не создаст.
Посмотрите дизассемблированный листинг, может там ничего такого и нет страшного.

Инлайнить функции в обработчик прерывания имеет смысл только для очень коротких функций, дальше 20...50 ассемблерных команд функции уже нет смысла инлайнить - выигрыш минимальный а цена слишком большая по сравнению с эффектом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пт мар 04, 2016 19:21:18 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
OKF писал(а):
Вопрос к ARV. хотя, и не только.))
Нужна быстрая реакция на прерывание. И хотелось что бы вся задача крутилась в прерывании.
Но, т.к. в задаче имеются функции, будет увеличен и пролог, что крайне нежелательно.
Собственно вопрос. Возможно ли что бы прологом/эпилогом были оформлены уже сами функции?
Т.е., что бы этот огромный пролог располагался не с самого начала обработчика?
OKF писал(а):
А нет ли возможности принудительно запретить формирование пролога?
Т.е., что бы функции брали на себя эту заботу. Либо "не светить" функции в ISR, что аналогично?
Инлайн, как я понимаю, не гарантирует инлайн на 100%?

если хотите, используйте "голый" обработчик прерываний
Код:
ISR(TIMER0_OVF_vect, ISR_NAKED)
в этом случае компилятор не будет генерировать ни пролог, ни эпилог функции обработчика - делайте, что хотите

если надо, чтобы функция ГАРАНТИРОВАННО инлайнилась, используйте атрибут always_inline
Код:
inline void my_func(void) __attribute__((always_inline)){
//}


учтите, я ответил на ваши вопросы, но что вы там при помощи этих советов накодите, будет целиком на вашей совести

P.S. кстати, static-функции достаточно неплохо инлайнятся автоматически при включении оптимизиции, особенно, если вызываются из одного места :)))

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2195 ]     ... , , , 96, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 82


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y