Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Re: Вопросы по С/С++ (СИ)

Сообщение BlackKilkennyCat »

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

const char TelMesALARM[] PROGMEM = "$9 ALARM\r\n\0";
насчёт последнего символа у меня сомнения. Вроде, должен автоматически добавлятся.
Последний раз редактировалось BlackKilkennyCat Вт дек 29, 2020 09:29:51, всего редактировалось 1 раз.
Реклама
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Вопросы по С/С++ (СИ)

Сообщение a_skr »

const char TelMesALARM[] PROGMEM = "$9 ALARM\r\n";
ps так и есть. автоматически
Реклама
Аватара пользователя
FeCat
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

Re: Вопросы по С/С++ (СИ)

Сообщение FeCat »

Спасибо!
А как с кавычками, одинарными и двойными?
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Вопросы по С/С++ (СИ)

Сообщение a_skr »

я проверял под винду и линукс без PROGMEM:
const char s[] = "$9 ALARM\r\n";

ps сейчас под AVR скомпилировалось
const char s[] PROGMEM = "$9 ALARM\r\n";
Реклама
Эиком - электронные компоненты и радиодетали
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Re: Вопросы по С/С++ (СИ)

Сообщение BlackKilkennyCat »

[uquote="FeCat",url="/forum/viewtopic.php?p=3950265#p3950265"]А как с кавычками, одинарными и двойными?[/uquote]
Также экранировать при помощи \
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="FeCat",url="/forum/viewtopic.php?p=3950265#p3950265"]А как с кавычками, одинарными и двойными?[/uquote]
На C++ можно даже так :)
Спойлер

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

const char* tree = R"===(
      *             ,
                       _/^\_
                      <     >
     *                 /.-.\         *
              *        `/&\`                   *
                      ,@.*;@,
                     /_o.I %_\    *
        *           (`'--:o(_@;
                   /`;--.,__ `')             *
                  ;@`o % O,*`'`&\
            *    (`'--)_@ ;o %'()\      *
                 /`;--._`''--._O'@;
                /&*,()~o`;-.,_ `""`)
     *          /`,@ ;+& () o*`;-';\
               (`""--.,_0 +% @' &()\
               /-.,_    ``''--....-'`)  *
          *    /@%;o`:;'--,.__   __.'\
              ;*,&(); @ % &^;~`"`o;@();         *
              /(); o^~; & ().o@*&`;&%O\
        jgs   `"="==""==,,,.,="=="==="`
           __.----.(\-''#####---...___...-----._
         '`         \)_`"""""`
                 .--' ')
               o(  )_-\
                 `"""` `
    )===";
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Вопросы по С/С++ (СИ)

Сообщение uldemir »

[звучит гонг!]Эй, народ, хватит засорять тему про stm8, когда обсуждается чисто С.

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

[uquote="uldemir",url="/forum/viewtopic.php?p=3930461#p3930461"]Пытаюсь сделать копирование массивов с использованием ПДП...

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

void copy_data_dma (uint8_t * src, uint8_t * dst, uint16_t count) {
[/uquote]
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

[uquote="uldemir",url="/forum/viewtopic.php?p=3955885#p3955885"]А не должны ли эти указатели теперь быть ссылками на волатильные массивы, чтобы дальнейший код не подумал что там вечно нули?[/uquote]Не должны. Это просто адреса буферов.
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Вопросы по С/С++ (СИ)

Сообщение shindax »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3955900#p3955900"][uquote="uldemir",url="/forum/viewtopic.php?p=3955885#p3955885"]А не должны ли эти указатели теперь быть ссылками на волатильные массивы, чтобы дальнейший код не подумал что там вечно нули?[/uquote]Не должны. Это просто адреса буферов.[/uquote]
Указатели, как и Цезарь, никому ничего не должны... Про "волатильные массивы" Вы откуда узнали? :-D И кто такой "Дальнейший код"?
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Вопросы по С/С++ (СИ)

Сообщение uldemir »

Вот конкретный код который не работает при "whole program optimization". При "Interprocedure optimization" - вроде работает. (не работает так: при нажатии кнопки DOWN - не выходит из цикла и цвета на launchpad_Output выдаёт неверные, например вместо желтого - синий. Вернее либо черный, либо синий - надо еще проверить функцию check_color. Но почему кнопка не срабатывает? во всех остальных аналогичных местах работает )

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

void TestColor(void) {
    uint16_t color_array[4] = {0, 0, 0, 0};
    unsigned int i;
    t_color field_test_color;

    ColorSensorTestHSI(color_array, 1);
    while (kbdread() != KEY_DOWN) {
        field_test_color = check_color();
        copy_data_dma((uint8_t *)color_sensors, (uint8_t *)color_array, sizeof(color_array));
        switch (field_test_color) {
            case red:       LaunchPad_Output(RED); break;
            case green:     LaunchPad_Output(GREEN); break;
            case blue:      LaunchPad_Output(BLUE); break;
            case yellow:    LaunchPad_Output(RED  | GREEN); break;
            case cyan:         LaunchPad_Output(BLUE | GREEN); break;
            case magenta:   LaunchPad_Output(BLUE | RED); break;
            case white:     LaunchPad_Output(BLUE | RED | GREEN); break;
            case black:     LaunchPad_Output(0x00); break;
        }
//        for (i=0; i<4; i++) {
//            color_array[i] = color_sensors[i];
//        }
        while(dma_copy_busy) WaitForInterrupt();
        ColorSensorTestHSI(color_array, 0);
    }
    LaunchPad_Output(0);
}
Копирование через ПДП я применил взамен закоментированного фрагмента. И я опасаюсь, ай нет - ложная тревога. я там в функцию передаю указатель и данные там будут так и так.

p.s. приложил дизасм - с кнопкой криминала не вижу.
Спойлер

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

276       void TestColor(void) {
          TestColor():
000064d8:   B510                push       {r4, r14}
277       	uint16_t color_array[4] = {0, 0, 0, 0};
000064da:   2100                movs       r1, #0
000064dc:   2208                movs       r2, #8
000064de:   F1AD0D08            sub.w      r13, r13, #8
000064e2:   4668                mov        r0, r13
000064e4:   F004FD6C            bl         memset
281       	ColorSensorTestHSI(color_array, 1);
000064e8:   2101                movs       r1, #1
000064ea:   4668                mov        r0, r13
000064ec:   F7FEF900            bl         ColorSensorTestHSI
282       	while (kbdread() != KEY_DOWN) {
000064f0:   F004F92E            bl         kbdread
000064f4:   2804                cmp        r0, #4
000064f6:   D044                beq        $C$L64
000064f8:   F24914E8            movw       r4, #0x91e8
000064fc:   F2C20400            movt       r4, #0x2000
283       	    field_test_color = check_color();
          $C$L54:
00006500:   F000FBCE            bl         check_color
285       		switch (field_test_color) {
00006504:   2807                cmp        r0, #7
00006506:   D826                bhi        $C$L63
00006508:   E8DFF000            tbb        [pc, r0]
          $C$C342, $C$SW1:
0000650c:   1E22                subs       r2, r4, #0
0000650e:   161A                asrs       r2, r3, #0x18
00006510:   0E12                lsrs       r2, r2, #0x18
00006512:   060A                lsls       r2, r1, #0x18
00006514:   EA4F0808            mov.w      r8, r8
292       			case white:     LaunchPad_Output(BLUE | RED | GREEN); break;
          $C$L55:
00006518:   2007                movs       r0, #7
0000651a:   F004FB5D            bl         LaunchPad_Output
0000651e:   E01A                b          $C$L63
290       			case cyan: 		LaunchPad_Output(BLUE | GREEN); break;
          $C$L56:
00006520:   2006                movs       r0, #6
00006522:   F004FB59            bl         LaunchPad_Output
00006526:   E016                b          $C$L63
291       			case magenta:   LaunchPad_Output(BLUE | RED); break;
          $C$L57:
00006528:   2005                movs       r0, #5
0000652a:   F004FB55            bl         LaunchPad_Output
0000652e:   E012                b          $C$L63
288       			case blue:      LaunchPad_Output(BLUE); break;
          $C$L58:
00006530:   2004                movs       r0, #4
00006532:   F004FB51            bl         LaunchPad_Output
00006536:   E00E                b          $C$L63
289       			case yellow:    LaunchPad_Output(RED  | GREEN); break;
          $C$L59:
00006538:   2003                movs       r0, #3
0000653a:   F004FB4D            bl         LaunchPad_Output
0000653e:   E00A                b          $C$L63
287       			case green:     LaunchPad_Output(GREEN); break;
          $C$L60:
00006540:   2002                movs       r0, #2
00006542:   F004FB49            bl         LaunchPad_Output
00006546:   E006                b          $C$L63
286       			case red:       LaunchPad_Output(RED); break;
          $C$L61:
00006548:   2001                movs       r0, #1
0000654a:   F004FB45            bl         LaunchPad_Output
0000654e:   E002                b          $C$L63
293       			case black:     LaunchPad_Output(0x00); break;
          $C$L62:
00006550:   2000                movs       r0, #0
00006552:   F004FB41            bl         LaunchPad_Output
296       			color_array[i] = color_sensors[i];
          $C$L63:
00006556:   8820                ldrh       r0, [r4]
00006558:   F8B4E002            ldrh.w     r14, [r4, #2]
0000655c:   F8AD0000            strh.w     r0, [r13]
299       		ColorSensorTestHSI(color_array, 0);
00006560:   2100                movs       r1, #0
296       			color_array[i] = color_sensors[i];
00006562:   F8B4C004            ldrh.w     r12, [r4, #4]
00006566:   F8ADE002            strh.w     r14, [r13, #2]
0000656a:   88E3                ldrh       r3, [r4, #6]
0000656c:   F8ADC004            strh.w     r12, [r13, #4]
299       		ColorSensorTestHSI(color_array, 0);
00006570:   4668                mov        r0, r13
296       			color_array[i] = color_sensors[i];
00006572:   F8AD3006            strh.w     r3, [r13, #6]
299       		ColorSensorTestHSI(color_array, 0);
00006576:   F7FEF8BB            bl         ColorSensorTestHSI
282       	while (kbdread() != KEY_DOWN) {
0000657a:   F004F8E9            bl         kbdread
0000657e:   2804                cmp        r0, #4
00006580:   D1BE                bne        $C$L54
301       	LaunchPad_Output(0);
          $C$L64:
00006582:   2000                movs       r0, #0
00006584:   F004FB28            bl         LaunchPad_Output
00006588:   B002                add        r13, #8
0000658a:   BD10                pop        {r4, pc}
0000658c:   EA4F0808            mov.w      r8, r8
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Re: Вопросы по С/С++ (СИ)

Сообщение viiv »

[uquote="uldemir",url="/forum/viewtopic.php?p=3955924#p3955924"]В
Копирование через ПДП я применил взамен закоментированного фрагмента.[/uquote]
Смотреть лень, но я попытаюсь :-) если Вы объясните в чем "Профит" от заряжания DMA для копирования 8-ми байтов?
Кэш включен? Если включен, он инвалидируется в функции копирования?
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Вопросы по С/С++ (СИ)

Сообщение uldemir »

Ой. не пытайтесь - не нужно. вы мне ничем не обязаны.

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

Добавлено after 29 minutes:
solved:
Угу. оказалась бяка - спутал волатильный указатель с указателем на волатильную переменную. Написал второе, а надо было первое.

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

unsigned char * volatile data_ptr;
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

поделитесь опытом :shock:
как можно случайное число получить (желательно с примером в CodeVisionAVR)
я делаю так
speed=rand()%4+1; // случайное число от 1 до 4
speed=speed*100;
delay_ms(speed);
но видна закономерность в эффектах...

а как надо? желательно попроще и поподробнее!

в интернете пишут Использование наводок от АЦП. типа на ножку припаять маленькую антенну...
но никто толком не пишет как это программе описать CodeVisionAVR.

А ВЫ КАК ДЕЛАЕТЕ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

я поседнее время делаю так: сразу после старта, еще до того, как выполнится код, очищающий всю статическую память переменных, делаю CRC-подсчет по всей доступной памяти, и это число использую в качестве параметра функции srand. поскольку после подачи питания память устанавливается в непредсказуемое значение, этот метод даёт неплохое начальное распределение случайных чисел - можете сами убедиться по моему плейеру эффектов: при каждом включении питания стартует случайный файл.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Zhuk72 »

Можно запустить таймер на максимальную скорость и считывать значения его счётных регистров.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

как можно случайное число получить (желательно с примером в CodeVisionAVR)
Я так понял, N*rand()/RAND_MAX не подходит? Почему?
Но если уж так хочется поиграться, то есть разные алгоритмы. Например, автомат Вольфрама с правилом 30 даёт отличную случайную последовательность бит.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

ребята я на этой планете живу :facepalm: попроще ....

[uquote="ARV",url="/forum/viewtopic.php?p=3959959#p3959959"]я поседнее время делаю так: сразу после старта, еще до того, как выполнится код, очищающий всю статическую память переменных, делаю CRC-подсчет по всей доступной памяти, и это число использую в качестве параметра функции srand. поскольку после подачи питания память устанавливается в непредсказуемое значение, этот метод даёт неплохое начальное распределение случайных чисел - можете сами убедиться по моему плейеру эффектов: при каждом включении питания стартует случайный файл.[/uquote]

полностью согласен, :shock: но уровень не мой :)))
желательно попроще и поподробнее! желательно с примером в CodeVisionAVR :facepalm:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Serzh2000 писал(а):желательно попроще и поподробнее!
проще некуда.
Serzh2000 писал(а):с примером в CodeVisionAVR
а вот с этим никак, ибо использую только avr-gcc (WinAVR).

в общем и целом как-то так:

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

unsigned char *ptr = (void*)0;
int sum = 0;

for(int i=0; i < MAXRAM; ptr++) sum = calc_crc_1wire(sum, *ptr);

srand(sum);
MAXRAM - это максимальный адрес доступного RAM в выбраном МК, а clc_crc_1wire - это функция вычисления CRC по алгоритму 1-wire, можно и по любому иному алгоритму, но этот самый известный и в CVAVR тоже по идее должен быть в библиотеке...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Serzh2000, как уже уже сказали - чтобы rand() не работал при каждом включении одинаково, нужно прежде srand() вызывать. При каждом включении - с новым аргументом seed.
ARV для этого seed ОЗУ вычитывает. Я в одном из своих проектов при выключении записывал результат rand () в eeprom, и использовал его как seed при следующем включении.
Да и другие варианты получения нового значения seed при включении питания вполне можно придумать.
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение OKF »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3960073#p3960073"]Я в одном из своих проектов при выключении записывал результат rand () в eeprom, и использовал его как seed при следующем включении.[/uquote]
Аналогично. Наиболее просто.
Ответить

Вернуться в «Разные вопросы по МК»