Изучаем язык Си (Learn C language)
Moderator: STC
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Изучаем язык Си (Learn C language)
Будет. На то она и структура чтобы содержать множество полей.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
-
- LQFP144 - On Top Of The Game
- Posts: 1664
- Joined: Fri Jul 01, 2011 2:10 pm
- Location: г Уфа
Re: Изучаем язык Си (Learn C language)
мне просто трудно себе это представить .
и с типами данных я пока еще совем не разобрался .
для меня стукрура должна содержать один тип данных
а тут получается что тип как бы и один но в опереаторе IF не нужно ставить = 1 для того чтобы условие выполнилось .
) после паскаля Си очень тяжел . совершенно не понятно зачем все так запутали.
ну да ладно буду пробовать сегодня дополнение к рхх , должен перестать включатся пока обороты не упадут до уровня 800
и с типами данных я пока еще совем не разобрался .
для меня стукрура должна содержать один тип данных
а тут получается что тип как бы и один но в опереаторе IF не нужно ставить = 1 для того чтобы условие выполнилось .
) после паскаля Си очень тяжел . совершенно не понятно зачем все так запутали.
ну да ладно буду пробовать сегодня дополнение к рхх , должен перестать включатся пока обороты не упадут до уровня 800
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
ВАЗ21310 1.7i Я7.2 2001г
Re: Изучаем язык Си (Learn C language)
Попробуйте скомпилировать вот это код.
avr-gcc -c -mmcu=atmega16 -gdwarf-2 -Os gcc_test.c
avr-objdump -S gcc_test.o
На разных версиях GCC можно увидеть самый невероятный результат.
gcc_test.c:
#include <stdint.h>
#include <avr/io.h>
#define bool uint8_t
extern bool i2cSend (uint8_t);
void sneekle1 (void)
{
uint8_t answer = 0;
if (PIND & 0x40) {
answer = 1;
}
while (PIND & 0x40) {
}
i2cSend (answer);
}
void sneekle2 (void)
{
uint8_t answer = 0;
asm ("":"+g" (answer));
if (PIND & 0x40) {
answer = 1;
}
i2cSend (answer);
}
void sneekle3 (void)
{
uint8_t answer;
if ((answer = PIND & 0x40) != 0)
answer = 1;
i2cSend (answer);
}
void sneekle4 (void)
{
uint8_t answer = PIND;
answer = (answer & 0x40) ? 1 : 0;
i2cSend (answer);
}
void main (void)
{
sneekle1();
sneekle2();
sneekle3();
sneekle4();
}
avr-gcc -c -mmcu=atmega16 -gdwarf-2 -Os gcc_test.c
avr-objdump -S gcc_test.o
На разных версиях GCC можно увидеть самый невероятный результат.
gcc_test.c:
#include <stdint.h>
#include <avr/io.h>
#define bool uint8_t
extern bool i2cSend (uint8_t);
void sneekle1 (void)
{
uint8_t answer = 0;
if (PIND & 0x40) {
answer = 1;
}
while (PIND & 0x40) {
}
i2cSend (answer);
}
void sneekle2 (void)
{
uint8_t answer = 0;
asm ("":"+g" (answer));
if (PIND & 0x40) {
answer = 1;
}
i2cSend (answer);
}
void sneekle3 (void)
{
uint8_t answer;
if ((answer = PIND & 0x40) != 0)
answer = 1;
i2cSend (answer);
}
void sneekle4 (void)
{
uint8_t answer = PIND;
answer = (answer & 0x40) ? 1 : 0;
i2cSend (answer);
}
void main (void)
{
sneekle1();
sneekle2();
sneekle3();
sneekle4();
}
-
- LQFP144 - On Top Of The Game
- Posts: 1664
- Joined: Fri Jul 01, 2011 2:10 pm
- Location: г Уфа
Re: Изучаем язык Си (Learn C language)
кто бы подсказал , на пальцах , про типы переменных , констант , указателей в секу3 ... просто я пока пишу только опираясь на то что вижу , лиш модифицирую . но вот мне зачастую очень не понятно , как одна переменная вытает из другой ... структуры эти .. чтото сложно все (((
вот например что значит d-> ? понимаю что указатель .. но как это работает , не совсем понимаю ... как организуються структуры тоже не совсем понятно ....
вот например что значит d-> ? понимаю что указатель .. но как это работает , не совсем понимаю ... как организуються структуры тоже не совсем понятно ....
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
ВАЗ21310 1.7i Я7.2 2001г
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Изучаем язык Си (Learn C language)
Чтобы было проще понимать такие вещи нужно знать язык ассемблера. Я начинал изучение компьютеров с архитектуры и системы команд микропроцессоров.
Указатель это переменная которая хранит адрес другой переменной.
d это переменная хранящая адрес началы структуры. -> говорит что нужно взять адрес начала структуры, прибавить к нему смещение указанной переменной и обратится к памяти по полученному алресу.
Структура это последовательность переменных в памяти. Достаточно знать адрес структуры и ее тип чтобы обратиться к нужной переменной.
Указатель это переменная которая хранит адрес другой переменной.
d это переменная хранящая адрес началы структуры. -> говорит что нужно взять адрес начала структуры, прибавить к нему смещение указанной переменной и обратится к памяти по полученному алресу.
Структура это последовательность переменных в памяти. Достаточно знать адрес структуры и ее тип чтобы обратиться к нужной переменной.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
-
- LQFP144 - On Top Of The Game
- Posts: 1664
- Joined: Fri Jul 01, 2011 2:10 pm
- Location: г Уфа
Re: Изучаем язык Си (Learn C language)
файлы типо funconv.h это заголовки , тоесть в них нужно описывать переменные так? но не обязательно если переменная не выходит за рамки модуля ? так ?
тоесть если я хочу чтобы модуль UART увидел переменную idl_prstate.output_state то я должен в модуле UART подцепить заголовок funconv.h
а в самом заголовке описать
typedef struct
{
int16_t output_state; //!< regulator's memory
}idlregul_state_t;
/**Variable. State data for idling regulator */
idlregul_state_t idl_prstate;
или как ? чтото не пойму этот момент (((((((
тоесть если я хочу чтобы модуль UART увидел переменную idl_prstate.output_state то я должен в модуле UART подцепить заголовок funconv.h
а в самом заголовке описать
typedef struct
{
int16_t output_state; //!< regulator's memory
}idlregul_state_t;
/**Variable. State data for idling regulator */
idlregul_state_t idl_prstate;
или как ? чтото не пойму этот момент (((((((
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
ВАЗ21310 1.7i Я7.2 2001г
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Изучаем язык Си (Learn C language)
В заголовочных файлах нужно описывать переменные и функции не полностью, а только их типы.файлы типо funconv.h это заголовки , тоесть в них нужно описывать переменные так? но не обязательно если переменная не выходит за рамки модуля ? так ?
Переменная и функция могут быть видимыми за пределами модуля, а могут и не быть видимыми.
Если в заголовочном файле объявить переменную так как это делается в *.С, то будут проблемы, так как переменная будет объявлена ровно столько раз, сколько ты подключишь заголовочный файл. На то он и заголовочный чтобы указать только краткую информацию компилятору, только инрерфейс.
В *.H файле так делать нельзя:
idlregul_state_t idl_prstate;
нужно объявить переменную внутри *.C файла, а в заголовочном файле написать:
extern idlregul_state_t idl_prstate;
Ключевое слово extern говорит компилятору что такая переменная существует и ему этого достаточно, а линковщик уже при установлении связей проверит ее наличие и подставит нужный адрес.
За примерами далеко ходить не нужно, пример использования extern есть в файле vstimer.h
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
-
- LQFP144 - On Top Of The Game
- Posts: 1664
- Joined: Fri Jul 01, 2011 2:10 pm
- Location: г Уфа
Re: Изучаем язык Си (Learn C language)
спасибо попробую . просто я ищу выход из ситуации , так как обявить новые переменные в глобальной структуре param у меня не получилось -- вырос размер файла
поэтому хочу сделать так чтобы переменные в моем РХХ стали видимы в модуле UART и отображать их в менеджере , тогда не придеться обьявлять новые переменные , занимая место в стеке переменных
поэтому хочу сделать так чтобы переменные в моем РХХ стали видимы в модуле UART и отображать их в менеджере , тогда не придеться обьявлять новые переменные , занимая место в стеке переменных
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
ВАЗ21310 1.7i Я7.2 2001г
-
- LQFP144 - On Top Of The Game
- Posts: 1664
- Joined: Fri Jul 01, 2011 2:10 pm
- Location: г Уфа
Re: Изучаем язык Си (Learn C language)
очередной вопрос - точнее грабли ,
как мне вот это edat.param.starter_off использовать в модуле ckps.c ? заголовочный файл secu3.h подключен , но не хочет брать эту структуру!!!
совсем запутался (((
как это понять ?
// Функция линейной интерполяции
// x - значение аргумента интерполируемой функции
// a1,a2 - значения функции в узлах интерполяции
// x_s - значение аргумента функции в начальной точке
// x_l - длина отрезка между точками
// возвращает интерполированное значение функции * 16
например я создам массив допустим из 16 значений оборотов для 16 точек температуры
то как мне работать с этой интерполяцией ?
получаеться допустим сейчас Т = 34 , значит х = 34 , а1= число из массива вточке 30 , а2 = число из массива в точке 40 , x_s = 30 - первая точка слева ближайшая к аргументу , x_l =10 - длина отрезка между двумя точками , правильно??????
и к томуже я получу свои обороты умноженные на 16 ?
тоесть если я хочу сделать массив оборотов , то я пишу точно такуюже процедуру как
int16_t coolant_function(struct ecudata_t* d)
только в результат , в обращение к интерполяции я подставляю не вот это _GB(&d->fn_dat->f_tmp а свой массив?
как мне вот это edat.param.starter_off использовать в модуле ckps.c ? заголовочный файл secu3.h подключен , но не хочет брать эту структуру!!!
совсем запутался (((
как это понять ?
// Функция линейной интерполяции
// x - значение аргумента интерполируемой функции
// a1,a2 - значения функции в узлах интерполяции
// x_s - значение аргумента функции в начальной точке
// x_l - длина отрезка между точками
// возвращает интерполированное значение функции * 16
например я создам массив допустим из 16 значений оборотов для 16 точек температуры
то как мне работать с этой интерполяцией ?
получаеться допустим сейчас Т = 34 , значит х = 34 , а1= число из массива вточке 30 , а2 = число из массива в точке 40 , x_s = 30 - первая точка слева ближайшая к аргументу , x_l =10 - длина отрезка между двумя точками , правильно??????
и к томуже я получу свои обороты умноженные на 16 ?
тоесть если я хочу сделать массив оборотов , то я пишу точно такуюже процедуру как
int16_t coolant_function(struct ecudata_t* d)
только в результат , в обращение к интерполяции я подставляю не вот это _GB(&d->fn_dat->f_tmp а свой массив?
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
ВАЗ21310 1.7i Я7.2 2001г
-
- LQFP144 - On Top Of The Game
- Posts: 1664
- Joined: Fri Jul 01, 2011 2:10 pm
- Location: г Уфа
Re: Изучаем язык Си (Learn C language)
Code: Select all
int16_t idl_collant_rpm_t[16] = {1200,1200,1200,1200,1150, 1050, 1025, 1000, 975, 950, 925, 850, 800, 800, 800, 800};
-------
-----
//реализует функцию выборки целевых оборотов для РХХ из массива оборотов по температуре
int16_t idl_coolant_rpm_function(struct ecudata_t* d)
{
int16_t i, i1, t = d->sens.temperat;
if (!d->param.tmp_use)
return d->param.idling_rpm; //обороты хх = тем что заданы в окне оборотов РХХ, если блок неукомплектован ДТОЖ-ом
//-30 - минимальное значение температуры
if (t < TEMPERATURE_MAGNITUDE(-30))
t = TEMPERATURE_MAGNITUDE(-30);
//10 - шаг между узлами интерполяции по температуре
i = (t - TEMPERATURE_MAGNITUDE(-30)) / TEMPERATURE_MAGNITUDE(10);
if (i >= 15) i = i1 = 15;
else i1 = i + 1;
return simple_interpolation(t, idl_collant_rpm_t[i], idl_collant_rpm_t[i1],
(i * TEMPERATURE_MAGNITUDE(10)) + TEMPERATURE_MAGNITUDE(-30), TEMPERATURE_MAGNITUDE(10));
}
дописал в заголовок secu3.h объявление через extern стуктуры edat теперь я ее могу использовать в модуле ckps , надеюсь остальной программе я этим не навредил?
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
ВАЗ21310 1.7i Я7.2 2001г