Изучаем язык Си (Learn C language)

Русскоязычный форум SECU-3 по общим вопросам. General discussion in Russian language. English sub-forum.

Moderator: STC

User avatar
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)

Post by STC »

Будет. На то она и структура чтобы содержать множество полей.
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
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

мне просто трудно себе это представить .
и с типами данных я пока еще совем не разобрался .
для меня стукрура должна содержать один тип данных
а тут получается что тип как бы и один но в опереаторе IF не нужно ставить = 1 для того чтобы условие выполнилось .
) после паскаля Си очень тяжел . совершенно не понятно зачем все так запутали.
ну да ладно буду пробовать сегодня дополнение к рхх , должен перестать включатся пока обороты не упадут до уровня 800
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
teuer
DIP8 - Involved
Posts: 27
Joined: Tue Jul 26, 2011 9:01 am

Re: Изучаем язык Си (Learn C language)

Post by teuer »

Попробуйте скомпилировать вот это код.
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();
}
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

кто бы подсказал , на пальцах , про типы переменных , констант , указателей в секу3 ... просто я пока пишу только опираясь на то что вижу , лиш модифицирую . но вот мне зачастую очень не понятно , как одна переменная вытает из другой ... структуры эти .. чтото сложно все (((
вот например что значит d-> ? понимаю что указатель .. но как это работает , не совсем понимаю ... как организуються структуры тоже не совсем понятно ....
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
User avatar
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)

Post by STC »

Чтобы было проще понимать такие вещи нужно знать язык ассемблера. Я начинал изучение компьютеров с архитектуры и системы команд микропроцессоров.
Указатель это переменная которая хранит адрес другой переменной.
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
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

файлы типо 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;

или как ? чтото не пойму этот момент (((((((
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
User avatar
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)

Post by STC »

файлы типо 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
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

спасибо попробую . просто я ищу выход из ситуации , так как обявить новые переменные в глобальной структуре param у меня не получилось -- вырос размер файла
поэтому хочу сделать так чтобы переменные в моем РХХ стали видимы в модуле UART и отображать их в менеджере , тогда не придеться обьявлять новые переменные , занимая место в стеке переменных
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

очередной вопрос - точнее грабли ,
как мне вот это 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г
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

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г
Post Reply