STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

[uquote="a5021",url="/forum/viewtopic.php?p=3392898#p3392898"]Скобками устанавливаются приоритеты арифметических действий, которые повторяют правила начальной школы[/uquote]
не имеет особого значения, чего они там повторяют. Эти "правила начальной школы" тоже неявные так-то, просто общепринятые.
[uquote="a5021",url="/forum/viewtopic.php?p=3392898#p3392898"]Наружные, кстати, скобки имеют объяснение с позиций "культуры написания кода" ?[/uquote]
да.
[uquote="a5021",url="/forum/viewtopic.php?p=3392898#p3392898"]Никто не пишет код "вообще", не применительно ни к какой платформе.[/uquote]
говорите за себя :dont_know: я пишу. Скажите к примеру, что вот здесь стоит или хотя бы можно рассматривать "применительно к платформе"?
Спойлер

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

/*
 * modbus_tiny.c
 *
 *      Author: arkhnchul
 */

#include <stdint.h>
#include "modbus_tiny.h"
#include "crc16.h"

volatile mb_data_t MB;

void mb_init() {
    MB.state = MB_STATE_IDLE;
    MB.ADU_length = 0;
}

void mb_cycle_tick() {
    switch (MB.state) {
    case MB_STATE_REQUEST_READY:
        MB.state = MB_STATE_PROCESSING;
        mb_process_request();
        break;
    case MB_STATE_RESPONSE_READY:
        mb_crc_fill();
        MB.state = MB_STATE_TRANSMITTING;
        mb_port_transmit_response();
        break;
    }
}

void mb_process_request() {
    /* incoming frame already contains 2-byte CRC at the end */
    const uint16_t crc_computed = crc16_compute(MB.buffer, MB.ADU_length - 2);
    /* CRC transmits as little-endian FTGJ. */
    const uint16_t crc_received = MB_COMBINE_UINT16(
            MB.buffer[MB.ADU_length - 1], MB.buffer[MB.ADU_length - 2]);
    /* frame with mismatched CRC must be ignored silently */
    if (crc_computed != crc_received) {
        MB.state = MB_STATE_IDLE;
        return;
    }

    switch (MB_ADU_FUNCTION) {
#ifdef MB_HAS_FUNCTION_DIAGNOSTICS
        case MB_FUNC_DIAGNOSTICS:
        mb_function_diagnostic();
        break;
#endif
#if defined(MB_HAS_FUNCTION_READ_HOLDING_REGISTERS) || defined(MB_HAS_FUNCTION_READ_INPUT_REGISTERS)
#ifdef MB_HAS_FUNCTION_READ_HOLDING_REGISTERS
        case MB_FUNC_READ_HOLDING_REGISTERS:
#endif
#ifdef MB_HAS_FUNCTION_READ_INPUT_REGISTERS
        case MB_FUNC_READ_INPUT_REGISTERS:
#endif
        mb_function_read_registers();
        break;
#endif
#ifdef MB_HAS_FUNCTION_WRITE_SINGLE_REGISTER
        case MB_FUNC_WRITE_SINGLE_REGISTER:
        mb_function_write_single_register();
        break;
#endif
#if defined(MB_HAS_FUNCTION_READ_COILS) || defined(MB_HAS_FUNCTION_READ_DISCRETE_INPUTS)
#ifdef MB_HAS_FUNCTION_READ_COILS
        case MB_FUNC_READ_COILS:
#endif
#ifdef MB_HAS_FUNCTION_READ_DISCRETE_INPUTS
        case MB_FUNC_READ_DISCRETE_INPUTS:
#endif
        mb_function_read_coils();
        break;
#endif
        default:
        mb_raise_exception(MB_EXCEPTION_FUNCTION_UNSUPPORTED);
    }
    if (MB.state == MB_STATE_PROCESSING)
        MB.state = MB_STATE_RESPONSE_READY;
}

#if defined(MB_HAS_FUNCTION_READ_HOLDING_REGISTERS)||defined(MB_HAS_FUNCTION_READ_INPUT_REGISTERS)
void mb_function_read_registers(void) {
    const uint16_t register_start_address = MB_ADU_GET_UINT16(2);
    /* Modbus spec says that register count is 2-byte field,
     * but simultaneously it has to be less or equal 125 (decimal)
     * so we can take just LSB */
    const uint8_t register_count = MB.buffer[5];

    if (register_count == 0) {
        mb_raise_exception(MB_EXCEPTION_WRONG_ADDRESS);
        return;
    }
    /* check if we have enough space for response in MB.buffer */
    if (register_count > (MB_BUFFER_SIZE - 5) / 2) {
        mb_raise_exception(MB_EXCEPTION_INTERNAL_FAILURE);
        return;
    }

    /* response "byte count" field; each register value consumes two bytes */
    MB.buffer[2] = register_count * 2;
    /* as for now, ADU buffer contains 3 bytes - slave address, function code and byte count */
    MB.ADU_length = 3;
    /* now fill rest of buffer with registers values */
    for (uint16_t i = register_start_address;
            i < register_start_address + register_count; i++) {

        uint16_t register_value;

        // TODO: implement device-specific read actions
        register_value = mb_port_read_register(i);

        /* check if exception had been raised */
        if (MB.state == MB_STATE_RESPONSE_READY)
            break;

        MB_ADU_SET_UINT16(MB.ADU_length, register_value);
        MB.ADU_length += 2;
    }
}
#endif

#ifdef MB_HAS_FUNCTION_DIAGNOSTICS

static enum {
    MB_SUB_RETURN_QUERY = (uint16_t) 0x00
};

void mb_function_diagnostic(void) {
    switch (MB_ADU_SUBFUNCTION) {
        case MB_SUB_RETURN_QUERY:
        /* "Return Query" does nothing, just echoes back the request */
        MB.ADU_length-=2;
        break;
        default:
        mb_raise_exception(MB_EXCEPTION_FUNCTION_UNSUPPORTED);
    }
}

#endif

#ifdef MB_HAS_FUNCTION_WRITE_SINGLE_REGISTER
void mb_function_write_single_register(void) {
    const uint16_t register_address = MB_ADU_GET_UINT16(2);
    uint16_t register_value;

    register_value = MB_ADU_GET_UINT16(4);
    // TODO: implement device-specific write actions
    mb_port_write_register(register_address, register_value);
}
#endif

#if defined(MB_HAS_FUNCTION_READ_COILS) || defined(MB_HAS_FUNCTION_READ_DISCRETE_INPUTS)
void mb_function_read_coils(void) {
    const uint16_t start_address=MB_ADU_GET_UINT16(2);
    const uint16_t coil_count=MB_ADU_GET_UINT16(4);
    uint8_t *byte_count=&(MB.buffer[2]);
    uint8_t *current_byte=&(MB.buffer[3]);
    uint8_t current_bit=0;

    MB.ADU_length = 4;
    if (coil_count == 0) {
        mb_raise_exception(MB_EXCEPTION_WRONG_ADDRESS);
        return;
    }
    /* check if we have enough space for response in MB.buffer */
    if(coil_count > (MB_BUFFER_SIZE - 5) * 8) {
        mb_raise_exception(MB_EXCEPTION_INTERNAL_FAILURE);
        return;
    }

    *current_byte=0;
    *byte_count=1;

    for(uint16_t coil_address=start_address;
            coil_address < start_address+coil_count;
            coil_address++) {
        uint8_t coil_value=mb_port_read_coil(coil_address);
        /* check if exception had been raised */
        if(MB.state==MB_STATE_RESPONSE_READY)
            break;

        if(current_bit>7) {
            current_byte++;
            *current_byte=0;
            current_bit=0;
            (*byte_count)++;
            MB.ADU_length++;
        }

        if(current_bit) {
            (*current_byte)<<=1;
        }

        if(coil_value) {
            (*current_byte) |= 1;
        }
        current_bit++;
    }
}
#endif

#ifdef MB_HAS_FUNCTION_WRITE_SINGLE_COIL
void mb_function_write_single_coil(void) {
    const uint16_t coil_address = MB_ADU_GET_UINT16(2);
    uint16_t coil_value = MB_ADU_GET_UINT16(4);
    // TODO: implement device-specific write actions
    switch(coil_value){
    case 0x0000:
        mb_port_write_coil(coil_address, 0x00);
        break;
    case 0xff00:
        mb_port_write_coil(coil_address, 0x01);
        break;
    default:
        mb_raise_exception(MB_EXCEPTION_WRONG_VALUE);
    }
}
#endif

void mb_raise_exception(mb_exception_t exception) {
    MB_ADU_FUNCTION|= 0x80;
    MB_ADU_EXCEPTION = exception;
    MB.ADU_length = 3;
    if(MB.state==MB_STATE_PROCESSING)
    MB.state = MB_STATE_RESPONSE_READY;
}

void mb_rx_byte(uint8_t byte) {
    if (MB.state == MB_STATE_IDLE) {
        if (byte == MB.slave_addr)
            MB.state = MB_STATE_RECEIVING;
        else
            MB.state = MB_STATE_IGNORE;
    }
#if MB_BUFFER_SIZE < 256
    if (MB.ADU_length >= MB_BUFFER_SIZE) {
        MB.state = MB_STATE_IGNORE;
    } else
#endif
    if (MB.state == MB_STATE_RECEIVING) {
        MB.buffer[MB.ADU_length] = byte;
        MB.ADU_length++;
    }
}

void mb_rx_completed() {
    /* Incoming data can be treated as somehow valid only if it was recognized
     * as frame addressed to our slave during idle state and we had started
     * to accept bytes */
    if (MB.state == MB_STATE_RECEIVING) {
        MB.state = MB_STATE_REQUEST_READY;
    }
    /* otherwise the whole portion should been ignored */
    else {
        MB.ADU_length = 0;
        MB.state = MB_STATE_IDLE;
    }
}

void mb_transmit_completed(void) {
    MB.ADU_length = 0;
    MB.state = MB_STATE_IDLE;
}

void mb_crc_fill(void) {
    uint16_t crc_computed;
    uint8_t * tmp = &MB.buffer[MB.ADU_length]; // pointer to future position of CRC in ADU
    crc_computed = crc16_compute(MB.buffer, MB.ADU_length);
    MB.ADU_length += 2;
    /* CRC transmits as little-endian FTGJ. */
    tmp[0] = MB_LSB(crc_computed);
    tmp[1] = MB_MSB(crc_computed);
}
вполне себе архитектурно независимая часть. Собирается и работает без изменений на "большом компе" с архитектурой amd64, контроллерах stm32, stm8, avr - это только то, на чем проверял.
Реклама
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

arkhnchul
А фримодбас чего не юзаем? Давным давно во всех проектах живет. Слейв правда. Мастера мне пришлось самому писать.
СпойлерХотя - это что тинька? Не влезает в тиньку? Ща опять холивар про размер флеша в 2018м начну. Эх... :)))
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

фримодбас не влез бы нормально в stm8s103f2) мой велосипед там целиком собирается примерно в 600-700 байт.
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение prinv »

Stm8 это вроде не ARM...
Никакая контра не уйдёт от нас
Реклама
Эиком - электронные компоненты и радиодетали
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

ну да. И avr - не arm. Просто демонстрация архитектурно-независимого куска.
Реклама
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3392948#p3392948"]Эти "правила начальной школы" тоже неявные так-то, просто общепринятые.[/uquote]
Я бы, к примеру, постыдился так говорить. В образованной среде могут не понять. Хотя, простейшие арифметические действия вызывают затруднения у слишком многих, чтобы считать это нормальным явлением.
да.
Нет.
говорите за себя :dont_know: я пишу.
Такой платформонезависимый и я пишу:

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

MY_MAGIC_MACRO(A + B);
Его можно даже языково-независимым назвать при желании.
Скажите к примеру, что вот здесь стоит или хотя бы можно рассматривать "применительно к платформе"?
Этот кусок во многом повторяет подход моего кода, опубликованного несколькими строками выше. Вы просто все "зависимые" части вынесли в другое место.

Линии связи вообще неудачное место, где платформо-независимый код может блеснуть. На приемной стороне могут не только байты посыпаться не в том порядке, но и биты. Не знаю, правда, может ли такое в модбасе случиться. Ни имел никогда дела.
Собирается и работает без изменений на "большом компе" с архитектурой amd64, контроллерах stm32, stm8, avr - это только то, на чем проверял.
Вот видите, вы сами даже оговариваете, где он работает, оставляя за скобками мысль, что вполне могут найтись платформы, где это работать не будет. Вот и цена платформонезависимости. Пустые разговоры, в общем.
Реклама
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение prinv »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3393033#p3393033"]ну да. И avr - не arm.[/uquote]
Avr32 вполне себе arm :-)
Никакая контра не уйдёт от нас
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Нет
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение prinv »

[uquote="a5021",url="/forum/viewtopic.php?p=3393076#p3393076"]Нет[/uquote]
Угу. Неправильно ATSAM назвал Avr32.
Никакая контра не уйдёт от нас
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

[uquote="a5021",url="/forum/viewtopic.php?p=3393040#p3393040"]Я бы, к примеру, постыдился так говорить. В образованной среде могут не понять.[/uquote]
Вы точно понимаете, что такое явная и неявная семантика?

[uquote="a5021",url="/forum/viewtopic.php?p=3393040#p3393040"]Вы просто все "зависимые" части вынесли в другое место.[/uquote]
ага. И независимые пишу "вообще", без оглядки на платформу. Чего, по-вашему, никто не делает)

[uquote="a5021",url="/forum/viewtopic.php?p=3393040#p3393040"]Линии связи вообще неудачное место, где платформо-независимый код может блеснуть. На приемной стороне могут не только байты посыпаться не в том порядке, но и биты.[/uquote]
на уровне приложения протоколу примерно пофиг, в каком порядке байты с битами летают по физической линии.
[uquote="a5021",url="/forum/viewtopic.php?p=3393040#p3393040"]Не знаю, правда, может ли такое в модбасе случиться. Ни имел никогда дела.[/uquote]
там есть безумство - почти весь ADU передается как big endian, кроме двух байт контрольной суммы в конце, которые идут как little endian. "Так склалось"(с).

[uquote="a5021",url="/forum/viewtopic.php?p=3393040#p3393040"]Вот видите, вы сами даже оговариваете, где он работает, оставляя за скобками мысль, что вполне могут найтись платформы, где это работать не будет[/uquote]
скорее компиляторы.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3393114#p3393114"]Вы точно понимаете, что такое явная и неявная семантика?[/uquote]
Я точно понимаю, что вас клонит куда-то совершенно не туда. Выражения вида A = B * 2 - 1 и A = ((B * 2) - 1) полностью тождественны, что с точки зрения арифметики, что синтаксиса языка Си. Скобки лишние. Все. Или "неявная семантика" здесь вносит существенные коррективы? Вы про что спрашивали? Поясните.
ага. И независимые пишу "вообще", без оглядки на платформу. Чего, по-вашему, никто не делает)
О, да-да. Я надысь по вашему рецепту тоже написал полностью без оглядки на платформу:

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

for(i = 0; i < 10; i++)
Неправ я был, выходит. Оказывается, писать платформонезависимый код -- это очень просто, все его пишут и помногу.
на уровне приложения протоколу примерно пофиг, в каком порядке байты с битами летают по физической линии.
Говорю же, циклу "for" пофиг вообще на все, нужно только соблюсти требования синтаксиса.
там есть безумство - почти весь ADU передается как big endian, кроме двух байт контрольной суммы в конце, которые идут как little endian. "Так склалось"(с).
В BLE наблюдается что-то похожее. Недавно только плевался.

PS. Явная и неявная семантики продолжают истязать программистов Боша. Попался на глаза еще один перл:

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

var6 = var3 * var4 * (var5 * var6);
Все переменные типа double. Такой вот свежий взгляд на сочетательный закон умножения.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

[uquote="a5021",url="/forum/viewtopic.php?p=3393138#p3393138"]Выражения вида A = B * 2 - 1 и A = ((B * 2) - 1) полностью тождественны, что с точки зрения арифметики[/uquote]
да
[uquote="a5021",url="/forum/viewtopic.php?p=3393138#p3393138"]что синтаксиса языка Си[/uquote]
эмм, нет. Аккуратнее с терминологией, которую используете) Эдак настанет время спросить "понимаете ли вы, что такое синтаксис?".
[uquote="a5021",url="/forum/viewtopic.php?p=3393138#p3393138"]Вы про что спрашивали? Поясните.[/uquote]
"Вы точно понимаете, что такое явная и неявная семантика?" - вроде по-русски написал.

[uquote="a5021",url="/forum/viewtopic.php?p=3393138#p3393138"]вроде по-русски написал. О, да-да. Я надысь по вашему рецепту тоже написал полностью без оглядки на платформу[/uquote]
воот, можете же, когда хотите.

[uquote="a5021",url="/forum/viewtopic.php?p=3393138#p3393138"]

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

var6 = var3 * var4 * (var5 * var6);
Все переменные типа double. Такой вот свежий взгляд на сочетательный закон умножения.[/uquote]
и? я тоже так делаю - просто для обращения внимания, в случае, если произведение var5 * var6 что-то значит само по себе.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Эдак настанет время спросить "понимаете ли вы, что такое синтаксис?".
Да понял я, что вы никогда не сможете конкретно ответить, зачем там скобки. Остальное обсуждение можно сворачивать по той же причине.
"Вы точно понимаете, что такое явная и неявная семантика?" - вроде по-русски написал.
В свежесочиненной тарабарщине не разбираюсь. Это правда.
и? я тоже так делаю - просто для обращения внимания, в случае, если произведение var5 * var6 что-то значит само по себе.
Да никаких "и?". Сочетательный закон умножения, как раз и утверждает, что отдельные произведения сами по себе ничего не значат.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

[uquote="a5021",url="/forum/viewtopic.php?p=3393240#p3393240"]Да понял я, что вы никогда не сможете конкретно ответить, зачем там скобки.[/uquote]
для явного указания последовательности операций. Не компилятору (он может и наплевать и для операций равных приоритетов сделать по-своему), а человеку, который туда глазами смотрит.
[uquote="a5021",url="/forum/viewtopic.php?p=3393240#p3393240"]В свежесочиненной тарабарщине не разбираюсь.[/uquote]
теории формальных языков как бы не век уже. Свежесочиненная такая свежесочиненная.
[uquote="a5021",url="/forum/viewtopic.php?p=3393240#p3393240"]Сочетательный закон умножения, как раз и утверждает, что отдельные произведения сами по себе ничего не значат.[/uquote]
не-а. Он утверждает, что результат не изменится от изменения последовательности вычислений, а не то, что отдельно взятая часть не имеет смысла в некоей предметной области.
Кстати, в общем случае это верно только для чистой арифметики, такие дела. В этих наших коплюктерах обычно операндами могут выступать не только константы и не-volatile переменные. При желании можно (но не нужно))) наколбасить выражение, результат которого таки зависит от порядка вычисления операндов.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3393265#p3393265"]для явного указания последовательности операций. Не компилятору (он может и наплевать и для операций равных приоритетов сделать по-своему), а человеку, который туда глазами смотрит.[/uquote]
Какую последовательность действий определяют внешние скобки? Вы читаете, что пишете?
теории формальных языков как бы не век уже. Свежесочиненная такая свежесочиненная.
По этой причине вы вопросом на вопрос пол-дня отвечаете? Спрашиваю нафиг там скобки, вы мне выкатываете "Вы точно понимаете, что такое явная и неявная семантика?". И быстренько так с ваших же слов выясняется, что компилятору это не нужно, а нужно "человеку, который туда глазами смотрит". Так за каким тогда про семантику разговор заводили? Выходит, что вы или не понимаете или не запоминаете, что говорили совсем недавно. И как мне с вами разговаривать?
не-а. Он утверждает, что результат не изменится от изменения последовательности вычислений, а не то, что отдельно взятая часть не имеет смысла в некоей предметной области.
Предлагаю отринуть неосязаемые философские сущности и посмотреть в исходник (стр. 971). Буде узреете там хоть какой-нибудь "смысл в некоей предметной области" -- продолжим, а пока давайте закончим всякую муть из пальца высасывать.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

[uquote="a5021",url="/forum/viewtopic.php?p=3393287#p3393287"]Какую последовательность действий определяют внешние скобки?[/uquote]внешние - никакую. Уточняйте, что вас интересует.
[uquote="a5021",url="/forum/viewtopic.php?p=3393287#p3393287"]По этой причине вы вопросом на вопрос пол-дня отвечаете?[/uquote]любопытно, какая извращенная логика побудила вас связать два этих факта)
[uquote="a5021",url="/forum/viewtopic.php?p=3393287#p3393287"]быстренько так с ваших же слов выясняется, что компилятору это не нужно, а нужно "человеку, который туда глазами смотрит". Так за каким тогда про семантику разговор заводили?[/uquote]мне в третий раз повторить вопрос? Или задать еще один, раз вы не имеете особого понятия, о чем идет речь?
[uquote="a5021",url="/forum/viewtopic.php?p=3393287#p3393287"]Предлагаю вам отринуть неосязаемые философские сущности и посмотреть в исходник (стр. 971). Буде узреете там великий смысл -- продолжим, а пока давайте закончим всякую муть из пальца высасывать.[/uquote]конкретно за такой код хорошо бы отрывать ноги по самую шею. Но не за скобки на 971 строке, а за месиво в шести предыдущих и имена переменных valX.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

внешние - никакую. Уточняйте, что вас интересует.
Алилуйя! Свершилось! После грозных расспросов про семантику, семантически-ничтожный в данном случае элемент (скобки) был таки признан бесполезным. Офигеть!

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

Семантика -- набор синтаксически правильных конструкций языка, разбирая которые, компилятор составляет набор инструкций исполняемого кода. Скобки в обсуждаемом примере не изменяют набора инструкций, что позволяет утверждать, что в данном случае они семантически-ничтожны. Вы не с того конца эту песню затянули.
конкретно за такой код хорошо бы отрывать ноги по самую шею. Но не за скобки на 971 строке, а за месиво в шести предыдущих и имена переменных valX.
Доброе утро, короче. Я еще успел с ними попереписываться немного. В общем, там ничего не исправить. Господь, как говорится, жги!
pvit
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Re: STM32 новичку в ARM что к чему

Сообщение pvit »

Немного поздновато, но возможно пригодится кому-то следующему. Недавно занимаюсь stm32, пока текущее мнение таково:

1. Платы и т.д.

Всякие Discovery - нафик, смысла мало. Если очень хочется и любитель бредбордов - blue pill с STM32F103C8T6 на али за пару баксов. Я предпочитаю сразу нарисовать нужную схему и заказать плату в Китае. Вообще STM32F103C8T6 можно лепить не глядя везде где влазит, потому что он самый распространенный и за счет массовости самый дешевый в штучных количествах (IMHO).

2. Программаторы и т.п.

Самый "дешево и сердито" - китайский ST-link v2, на али за пару баксов. Но есть нюанс. Многие любят лепить дебажные printf во время разработки. Вопрос - куда и как, чтобы достаточно быстро. Один из универсальных вариантов (под все операционки) - через J-Link по RTT. Из плюсов - достаточно тех же 4 пинов что и для прошивки. Из минусов - на али полный бардак с клонами. Я купил всяко-разно, ценой от 4 до 25 баксов, но пока руки не дошли поковыряться. Есть дешевые обкоцанные клоны J-link тупо с 4 проводами, самое то, если заработает :)

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

3. Софт

С ARM наконец-то можно послать в ад все кастомные и проприетарные поделия, и пользоваться стандартными тулчейнами - LLVM / GCC. Но конечно не напрямую, мы же не маньяки.

Если нужен C/C++ - есть смысл посмотреть PlatformIO.

- Он упрощает управление зависимостями, и избавляет от уродств, когда в репозиторий ручками копируются сторонние библиотеки.
- Он умеет сам детектить программаторы - обычно не требуется указывать COM-порт. Мелочь, но довольно удобная.
- Он еще много чего делает для организации нормального процесса разработки, но это тема отдельного разговора. Лучше сходить на их сайт и почитать документацию.

Для хейтеров С/C++, вроде меня, есть смысл посмотреть Rust.

- Он прекрасен :)
- К сожалению, конкретно для эмбедов его еще не доточили. Не, на нем делать можно уже сейчас, но надо сильно погружаться в нюансы, а время на подобное есть не у всех. Нормальный вариант ожидаем к осени. Отслеживать прогресс и подробности советую здесь: https://github.com/rust-lang-nursery/embedded-wg

PS. Написанное - исключительно мое личное мнение, наверняка не единственно верное, и может даже не верное вообще :)
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение prinv »

[uquote="pvit",url="/forum/viewtopic.php?p=3393897#p3393897"]С ARM наконец-то можно послать в ад все кастомные и проприетарные поделия, и пользоваться стандартными тулчейнами[/uquote]
А что не так с "кастомные и проприетарные поделия"? :))
Никакая контра не уйдёт от нас
pvit
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Re: STM32 новичку в ARM что к чему

Сообщение pvit »

[uquote="prinv",url="/forum/viewtopic.php?p=3393910#p3393910"]А что не так с "кастомные и проприетарные поделия"? :))[/uquote]
Вендорлок же, нафик надо. И полученный опыт плохо переносится на другие области (и из других областей). Речь ведь не о том, как написать мигалку светодиодом, а какой багаж знаний перенесется в следующий проект, который может быть на совсем другом чипе. При желании можно еще прикопаться по поводу цен и поддержки линукса :)
Ответить

Вернуться в «ARM»