Обсуждаем контроллеры компании Atmel.
Вт ноя 21, 2017 19:50:19
-D просто добавляется:
CFLAGS += $(addprefix -D,$(DEFS))
можно и сразу -DF_CPU=16000000
древняя make сейчас не единственная система сборки: cmake, qbs, scons (на питоне) используют для микроконтроллеров.
хорошая иде Clion использует cmake, там так примерно:
SET(FREQ "8000000")
SET(CMAKE_C_FLAGS "-Os -mmcu=${DEVICE} -DF_CPU=${FREQ}UL -std=gnu99 -Wl,--gc-sections")
в QtCreator qbs:
cpp.commonCompilerFlags: [
"-mmcu=MCU",
"-fdata-sections","-ffunction-sections",
"-Wl,-gc-sections",
"-Os",
"-std=gnu99","-Wall",
"-D F_CPU=8000000UL"
];
а вот в аврстудии 4.19 в настройках проекта просто пишется число 8000000 (ноль лишний тоже легко приписать) UL почему то не надо, потом оно каким то чудодейственным образом в последней вкладке само добавляется -DF_CPU=8000000UL где можно тоже такое добавить или отредактировать имеющееся - вызывает до сих пор дисонанс
по мне лучше всеж в хидере задефайнить
Ср ноя 22, 2017 12:29:41
oleg110592 при нормальном все гораздо проще что бы лишний раз не своминать отцёв основателей и сколько куда воды утекло многие ленятся ставить семёрку вмесото четвёрки
Ср ноя 22, 2017 21:51:29
Я не ожидал что вопрос вызовет такой ажиотаж. За F_CPU спрашивалось в контексте как "она" влияет на библиотеки задержки. Отладка программы становиться муторным делом... Как изменить частоту в окне "процессор", там всегда стоит 1000000? Вне зависимости от F_CPU.
Последний раз редактировалось
goodspeedmen Ср ноя 22, 2017 23:14:05, всего редактировалось 1 раз.
Ср ноя 22, 2017 22:35:23
goodspeedmen писал(а):Как изменить частоту в окне "процессор", там всегда стоит 1000000? Вне зависимости от F_CPU
в настройках проекта, там же, где и тип микроконтроллера выбираете. ну или поблизости.
А что F_CPU внутри файла никак не влияет на режим симулятора студии, все заумствующие здесь и не подумали. а я говорил - не надо F_CPU внутри файлов делать... а вот та частота, что "в окне" студии, должна и в F_CPU попадать автоматически.
Чт ноя 23, 2017 06:33:48
Как изменить частоту в окне "процессор", там всегда стоит 1000000? Вне зависимости от F_CPU.
Debug->AVR Simulator Options.
Влияет только на поле Stop Watch в том же окне "Процессор", следующая строчка за Frequency. Показывает, сколько микросекунд симулированного времени заняли эти <Cycle Counter> циклов симулируемого процессора. Активно, вестимо, только в симуляции.
Добавлено after 14 minutes 54 seconds:ARV писал(а):а вот та частота, что "в окне" студии, должна и в F_CPU попадать автоматически.
Угу, попадает. И, если ее напишешь где-то еще и в текстах, получишь ворнинг. Но, увы, эта частота из Project Options никоим образом не попадает в AVR Simulator Options, приходится ручками. Косячок, однако, в Студии, по крайней мере в 4.19...
Чт ноя 23, 2017 10:23:47
Отладка программы становиться муторным делом...
вот в чем вопрос - тут или терпеть или задержки закомментировать или железный отладчик. У меня 200ms секунды три "симулирует", наверняка зависит от конфигурации ПК
F_CPU действительно симулятору до лампочки, приходится ручонками
Чт ноя 23, 2017 17:25:53
ssd жёсткий чуток помогает, а так да. от всех железок зависит
Пт ноя 24, 2017 13:34:20
а я вот никогда вообще ни в одном заголовочнике его не прописываю - вообще проблем нет!
у вас есть, пусть даже гипотетически, возможность где-то среди файлов проекта забыть добавить main.h и поиметь гемору... у меня такой возможности даже в теории нет.
Если забуду и попытаюсь использовать - ошибка. Если попытаюсь переопределить - будет варнинг. Если будет переопределение там где не включил, то тогда да. Но это невозможно, т-к main.h у меня включается в абсолютно ВСЕ файлы, даже из аппнотов.
По поводу симулирования. Значит игрался я один раз с генератором звука - кнопочки на входе, меандр на выходе. Получалось что если поставил тактовую МК 8МГц, то были обрывы в звучании. А на 1МГц уже никакого рипения. Проц на ноуте i5. Модель не помню.
Сб ноя 25, 2017 22:06:21
если в первой строке программы написано include conf.h то первая его строка и будет первой строкой всей программы, если в conf.h первой строкой идёт F_CPU то его видят вообще все подключенные инклюды
Совершенно верно, но некоторым объяснять бесполезно, K&R они не читали и про ISO не знают, т.к. считают себя слишком умными для такого.
Вт ноя 28, 2017 16:33:53
- Код:
#include <stdio.h>
#include <avr/io.h>
#include <stdbool.h>
void delay(uint32_t, bool); // прототип функции. _mls _ms
int main(void)
{
DDRB = 0b00000011;
PORTB = 0b00000000;
while(1)
{
PORTB |= (1<<1);
delay(10, 0); // 1 ms.
PORTB &= ~(1<<1);
PORTB |= (1<<0);
delay(1000, 1); // 1 cek.
PORTB &= ~(1<<0);
delay(1000, 1);
}
}
/*
16000000 / 8 = 2000000; 1 / 2000000 = 0,0000005 = 5 чего то там.
16000000 / 64 = 250000; 1 / 250000 = 0,000004 = 4 миллисекунды.
16000000 / 1024 = 15625; 1 / 15625 = 0,000064 = 0,64 микросекунды.
*/
void delay(uint32_t Time_delay, bool _type)
{
uint16_t cycle = 0x00;
uint32_t Tick_Times = 0x00;
if(_type == 0)
{
TCCR0B = 0b00000011; // Пуск таймера_0 с предделителем на 8.
Tick_Times = Time_delay * 2; // ;
}
else
{
uint8_t temp_t = 0x00;
Time_delay *= 0x10; // Time_delay * 16 ~ 0,00096);
cycle = (Time_delay / 250); // количество циклов for;
temp_t = (Time_delay % 250);
Tick_Times = temp_t;
TCCR0B = 0b00000101; // Пуск таймера_0 с предделителем на 1024.
}
start_cycle:;
while(TCNT0 < Tick_Times) //Покуда счетчик насчитал меньше чем наш аргумент...
{
}
if(cycle != 0)
{
cycle--;
Tick_Times = 250;
TCNT0 = 0;
goto start_cycle;
}
TCCR0B = 0;
TCNT0 = 0; //Stop timer_0
}
/*Тут нацарапал функцию задержки, расчёты с предделением на 16 не сработали
но на 8 получилось почти точно */
Вт ноя 28, 2017 17:14:31
если в первой строке программы написано include conf.h то первая его строка и будет первой строкой всей программы, если в conf.h первой строкой идёт F_CPU то его видят вообще все подключенные инклюды
Совершенно верно, но некоторым объяснять бесполезно, K&R они не читали и про ISO не знают, т.к. считают себя слишком умными для такого.
Не, не работает эта шняга, ерунду говорите. Сделал вот в первом хидере дефайн, в левом файле делаю переопределение - 0 варнингов. Делаю инклюд хидера - опа! Варнинг. Дефайны у нас прописываются через команды препроцессора, их обрабатывает препроцессор. Потом у нас идет компиляция и на этом этапе никаких дефайнов уже нет - чисто константы или подставленные куски кода. В конце у нас работает линковщик - он сшивает куски скомпиленого кода. Так вот - константа или дефайн одного файла абсолютно не виден другим файлам, без инклюда либо объявления.
Подстановка, компиляция файлов, сшивание скомпиленых кусков. Именно так это работает. Заместо обвинять кого-то в некомпетентности могли бы сначала протестить то что написали.
Вт ноя 28, 2017 22:34:02
Ярослав555 видимо вы что то сделали не так, у меня прекрасно работает.
Вы пишите "Сделал вот в первом хидере дефайн, в левом файле делаю переопределение - 0 варнингов."
Где я вам говорил что нужно сделать переопределение? Во первых включите все варнинги и после компиляции они появятся, или поставьте не такие старые компилятор и ИДЕ.
"Так вот - константа или дефайн одного файла абсолютно не виден другим файлам, без инклюда либо объявления." - чуш, просто бред, или вы вязните в старом по которое не может или сами что то путаете. Ещё скажите что у вас не работают лямбда функции и констэкспр.
Мне не нужно это теститить по тому что все проекты у меня начинаются в F_CPU в первой строке файла conf.h который инклюдится в сишный компилируемый главный файл, первой строкой, и другие дефайны прекрасно видны.
Какая версия плюсов у вас? Какая версия ИДЕ?
ПРИМЕР
#include "conf.h"
int main(void)
{
while(1)
{
#include "test.h"
}
}
conf.h:
#define simulate false
#define atmega32
#define F_CPU 16000000UL
#define TestDef 6
#include <avr\io.h>
#include <util\delay.h>
#include <avr\eeprom.h>
#include <avr\pgmspace.h>
#include <avr\interrupt.h>
test.h:
PORTA = TestDef;
ДИЗАССЕМБЛЕР:
00000000 RJMP PC+0x002A Relative jump
00000001 NOP No operation
00000002 RJMP PC+0x0030 Relative jump
00000003 NOP No operation
00000004 RJMP PC+0x002E Relative jump
00000005 NOP No operation
00000006 RJMP PC+0x002C Relative jump
00000007 NOP No operation
00000008 RJMP PC+0x002A Relative jump
00000009 NOP No operation
0000000A RJMP PC+0x0028 Relative jump
0000000B NOP No operation
0000000C RJMP PC+0x0026 Relative jump
0000000D NOP No operation
0000000E RJMP PC+0x0024 Relative jump
0000000F NOP No operation
00000010 RJMP PC+0x0022 Relative jump
00000011 NOP No operation
00000012 RJMP PC+0x0020 Relative jump
00000013 NOP No operation
00000014 RJMP PC+0x001E Relative jump
00000015 NOP No operation
00000016 RJMP PC+0x001C Relative jump
00000017 NOP No operation
00000018 RJMP PC+0x001A Relative jump
00000019 NOP No operation
0000001A RJMP PC+0x0018 Relative jump
0000001B NOP No operation
0000001C RJMP PC+0x0016 Relative jump
0000001D NOP No operation
0000001E RJMP PC+0x0014 Relative jump
0000001F NOP No operation
00000020 RJMP PC+0x0012 Relative jump
00000021 NOP No operation
00000022 RJMP PC+0x0010 Relative jump
00000023 NOP No operation
00000024 RJMP PC+0x000E Relative jump
00000025 NOP No operation
00000026 RJMP PC+0x000C Relative jump
00000027 NOP No operation
00000028 RJMP PC+0x000A Relative jump
00000029 NOP No operation
0000002A CLR R1 Clear Register
0000002B OUT 0x3F,R1 Out to I/O location
0000002C LDI R28,0x5F Load immediate
0000002D LDI R29,0x08 Load immediate
0000002E OUT 0x3E,R29 Out to I/O location
0000002F OUT 0x3D,R28 Out to I/O location
00000030 RCALL PC+0x0003 Relative call subroutine
00000031 RJMP PC+0x0005 Relative jump
00000032 RJMP PC-0x0032 Relative jump
--- D:\WORK\Paper\DefTest\DT\GccApplication14\Debug/.././test.h ----------
PORTA = TestDef;
00000033 LDI R24,0x06 Load immediate
--- No source file ----------
00000034 OUT 0x1B,R24 Out to I/O location
00000035 RJMP PC-0x0001 Relative jump
00000036 CLI Global Interrupt Disable
00000037 RJMP PC-0x0000 Relative jump
ОСОБО ИНЕТЕРЕСУЮЩИЙ УЧАСТОК:
PORTA = TestDef;
00000033 LDI R24,0x06 Load immediate
00000034 OUT 0x1B,R24 Out to I/O location
00000035 RJMP PC-0x0001 Relative jump
00000036 CLI Global Interrupt Disable
00000037 RJMP PC-0x0000 Relative jump
порт выдаёт 6.
Ср ноя 29, 2017 09:27:39
то что нет варнинга, как раз означает что определение не видно. Я делал и по другому - определял дефайн в хидере мейна (первого файла), и пробовал присвоить переменной значение через этот дефайн в другом файле - если нет инклюда получаем ошибку.
По поводу того кода что Вы наваяли - так там совсем другое:
while(1)
{
#include "test.h"
}
означает что Вы в файл main.c ВСТАВИЛИ содержимое из test.h. А я говорю что инклюд подключенный в main.c СОВЕРШЕННО не видер в test.C (не h), без инклюда. ВИДНО и сделать ПОДСТАНОВКУ это СОВСЕМ разные вещи. Разберитесь как работает препроцессор. Когда вы делаете инклюд, это означает что на место инклюда ПРЕПРОЦЕССОР вставляет код из ВКЛЮЧАЕМОГО файла. И вот этот уже преобразованный ФАЙЛ видит компилятор. Ваш код это суть ОДИН файл после прохода препроцессора, поэтому компилятор все видит и не ругается. А вот когда будете собирать проект из тучи СИШНЫХ файлов, вот тогда познаете что такое препроцессор.
Ср ноя 29, 2017 14:09:08
"то что нет варнинга, как раз означает что определение не видно" - в моём примере TestDef виден, вы бы привели лучше короткий пример того что и как у вас не работает, в какой ситуации СОВЕРШЕННО не видит
Ср ноя 29, 2017 15:42:38
"то что нет варнинга, как раз означает что определение не видно" - в моём примере TestDef виден, вы бы привели лучше короткий пример того что и как у вас не работает, в какой ситуации СОВЕРШЕННО не видит
О Божечки! Он у Вас НЕ виден! Он у Вас ПОДСТАВЛЕН в мейн.с После прохода препроцессора заместо строчки #include "test.h" компилятор видит PORTA = TestDef;
Такс, простенький пример говорите.
Ну ок.
main.h:
#ifndef MAIN_H
#define MAIN_H
#define CONST 4
#endif
main.c:
#include "main.h"
void main (void)
{
char i = CONST; //работает, потому что вначале файла main.c вставлен текст из main.h
}
test.c (файл в том же проекте):
void somFunction (void)
{
char j = CONST; //ошибка, CONST не определено, потому как ничего не заинклюжено
}
P.S. У меня всё работает, я знаю как сделать так чтобы оно работало.
Ср ноя 29, 2017 17:31:45
вы просто забываете вставить нужный инклуд, вставьте include test и всё заработает.
видимо делаете какието фокусы с extern? но зачем, инклюд есть, зачем что то выдумывать
Ср ноя 29, 2017 18:01:50
вы просто забываете вставить нужный инклуд, вставьте include test и всё заработает.
видимо делаете какието фокусы с extern? но зачем, инклюд есть, зачем что то выдумывать
Дак о том и речь шла с самого начала! Что инклюды разные, может случиться переопределение F_CPU. Вы заявили что определенное в первом инклюде видно ВЕЗДЕ, назвали человека не компетентным и послали читать Карнигана-Риччи.
И я ничего не забываю. У меня НЕТ проблемы. У меня проекты с десятками файлов и хреновой тучей инклюженых файлов. Меня учить не надо. extern не нужен? Что-то новенькое!
А нука создай в хидере переменную и попробуй включить хидер в два файла. Что? Получилось? Или получил variable already defined during compilation? Да ты просто гуру, я посмотрю.
Ср ноя 29, 2017 18:11:10
Дак о том и речь шла с самого начала! Вы назвали человека не компетентным и послали Карнигана-Риччи.
ничего подобного! я его не читал.
описанных вами не со стыковок у меня нет вообще, но есть подозрение что вы как то странно компилируете кусками, так ли?
сишники любат вынуть из контекста а потом муторно искать и пытаться линконуть что нибудь такое, давно заметил.
Ср ноя 29, 2017 19:21:05
mazda писал(а):но есть подозрение что вы как то странно компилируете кусками, так ли?
что значит "кусками"? в Си каждый сишный файл компилируется отдельно и независимо от остальных. в продвинутых системах из всего множества файлов перекомпилируются при сборке только те, которые имеют дату свежее, чем соответствующий объектный файл из предыдущей сборки.
каждый Сишный исходник в проекте должен быть максимально независимым от других исходников, потому что компилируется он в виде отдельного куска проекта.
Ср ноя 29, 2017 19:34:22
Дак о том и речь шла с самого начала! Вы назвали человека не компетентным и послали Карнигана-Риччи.
ничего подобного! я его не читал.
описанных вами не со стыковок у меня нет вообще, но есть подозрение что вы как то странно компилируете кусками, так ли?
сишники любат вынуть из контекста а потом муторно искать и пытаться линконуть что нибудь такое, давно заметил.
я уже писал не раз как работает СБОРКА проекта. Будь то gcc, код вижн или мой IAR.
Сначала запускается ПРЕПРОЦЕССОР - это так называется программка. Препроцессор берет каждый C-файл, смотрит свои директивы - начинаются с символа # и исполняет их. Потом КОМПИЛЯТОР - другая программка компилирует каждый С файл ОТДЕЛЬНО. Потом ЛИНКОВЩИК сшивает ваш проект воедино. О чем с вами можно говорить когда вы не знаете что такое мультифайловый проект? У вас судя по всему только main.c с кучей хидеров. НЕЛЬЗЯ обойтись без extern - НЕТУ другого способа расширить область видимости файла. Сколько областей видимости вы знаете? Если попытаться обьявить переменную в хидере и попробовать включить его в несколько файлов - получите критическую ошибку попытки переопределить существующую переменную. ПОНЯТНО? Если нет - идите читать Карнигана-Ритчи.
Добавлено after 3 minutes 38 seconds:и причем тут сишники?
https://www.youtube.com/watch?v=suJhY0J ... XT&index=2 учитесь.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.