Указатели, как и Цезарь, никому ничего не должны... Про "волатильные массивы" Вы откуда узнали? :-D И кто такой "Дальнейший код"?
Вопросы по С/С++ (СИ)
- Сообщения: 378
- Зарегистрирован: Сб сен 19, 2009 07:02:19
[uquote="VladislavS",url="/forum/viewtopic.php?p=3955900#p3955900"][uquote="uldemir",url="/forum/viewtopic.php?p=3955885#p3955885"]А не должны ли эти указатели теперь быть ссылками на волатильные массивы, чтобы дальнейший код не подумал что там вечно нули?[/uquote]Не должны. Это просто адреса буферов.[/uquote]
Указатели, как и Цезарь, никому ничего не должны... Про "волатильные массивы" Вы откуда узнали? :-D И кто такой "Дальнейший код"?
Указатели, как и Цезарь, никому ничего не должны... Про "волатильные массивы" Вы откуда узнали? :-D И кто такой "Дальнейший код"?
- Реклама
Вот конкретный код который не работает при "whole program optimization". При "Interprocedure optimization" - вроде работает. (не работает так: при нажатии кнопки DOWN - не выходит из цикла и цвета на launchpad_Output выдаёт неверные, например вместо желтого - синий. Вернее либо черный, либо синий - надо еще проверить функцию check_color. Но почему кнопка не срабатывает? во всех остальных аналогичных местах работает )
Копирование через ПДП я применил взамен закоментированного фрагмента. И я опасаюсь, ай нет - ложная тревога. я там в функцию передаю указатель и данные там будут так и так.
p.s. приложил дизасм - с кнопкой криминала не вижу.
Код: Выделить всё
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А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Сообщения: 291
- Зарегистрирован: Чт ноя 06, 2014 13:09:06
[uquote="uldemir",url="/forum/viewtopic.php?p=3955924#p3955924"]В
Копирование через ПДП я применил взамен закоментированного фрагмента.[/uquote]
Смотреть лень, но я попытаюсь
если Вы объясните в чем "Профит" от заряжания DMA для копирования 8-ми байтов?
Кэш включен? Если включен, он инвалидируется в функции копирования?
Копирование через ПДП я применил взамен закоментированного фрагмента.[/uquote]
Смотреть лень, но я попытаюсь
Кэш включен? Если включен, он инвалидируется в функции копирования?
Ой. не пытайтесь - не нужно. вы мне ничем не обязаны.
Похоже, что ошибка где-то в i2c коде, так как и клавиатура, и цветовой сенсор работают через эту шину. и я вижу, что при считывании зелёный канал даёт отличающиеся от других каналов данные (стабильно неменяющиеся). Так что приведенный код работает без проблем. Проблема глубже.
Добавлено after 29 minutes:
solved:
Угу. оказалась бяка - спутал волатильный указатель с указателем на волатильную переменную. Написал второе, а надо было первое.
Похоже, что ошибка где-то в i2c коде, так как и клавиатура, и цветовой сенсор работают через эту шину. и я вижу, что при считывании зелёный канал даёт отличающиеся от других каналов данные (стабильно неменяющиеся). Так что приведенный код работает без проблем. Проблема глубже.
Добавлено after 29 minutes:
solved:
Угу. оказалась бяка - спутал волатильный указатель с указателем на волатильную переменную. Написал второе, а надо было первое.
Код: Выделить всё
unsigned char * volatile data_ptr;А люди посмотрят и скажут: "Собаки летят. Вот и осень."
поделитесь опытом
как можно случайное число получить (желательно с примером в CodeVisionAVR)
я делаю так
speed=rand()%4+1; // случайное число от 1 до 4
speed=speed*100;
delay_ms(speed);
но видна закономерность в эффектах...
а как надо? желательно попроще и поподробнее!
в интернете пишут Использование наводок от АЦП. типа на ножку припаять маленькую антенну...
но никто толком не пишет как это программе описать CodeVisionAVR.
А ВЫ КАК ДЕЛАЕТЕ?
как можно случайное число получить (желательно с примером в CodeVisionAVR)
я делаю так
speed=rand()%4+1; // случайное число от 1 до 4
speed=speed*100;
delay_ms(speed);
но видна закономерность в эффектах...
а как надо? желательно попроще и поподробнее!
в интернете пишут Использование наводок от АЦП. типа на ножку припаять маленькую антенну...
но никто толком не пишет как это программе описать CodeVisionAVR.
А ВЫ КАК ДЕЛАЕТЕ?
- Реклама
я поседнее время делаю так: сразу после старта, еще до того, как выполнится код, очищающий всю статическую память переменных, делаю CRC-подсчет по всей доступной памяти, и это число использую в качестве параметра функции srand. поскольку после подачи питания память устанавливается в непредсказуемое значение, этот метод даёт неплохое начальное распределение случайных чисел - можете сами убедиться по моему плейеру эффектов: при каждом включении питания стартует случайный файл.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Можно запустить таймер на максимальную скорость и считывать значения его счётных регистров.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Я так понял, N*rand()/RAND_MAX не подходит? Почему?как можно случайное число получить (желательно с примером в CodeVisionAVR)
Но если уж так хочется поиграться, то есть разные алгоритмы. Например, автомат Вольфрама с правилом 30 даёт отличную случайную последовательность бит.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
ребята я на этой планете живу
попроще ....
[uquote="ARV",url="/forum/viewtopic.php?p=3959959#p3959959"]я поседнее время делаю так: сразу после старта, еще до того, как выполнится код, очищающий всю статическую память переменных, делаю CRC-подсчет по всей доступной памяти, и это число использую в качестве параметра функции srand. поскольку после подачи питания память устанавливается в непредсказуемое значение, этот метод даёт неплохое начальное распределение случайных чисел - можете сами убедиться по моему плейеру эффектов: при каждом включении питания стартует случайный файл.[/uquote]
полностью согласен,
но уровень не мой
желательно попроще и поподробнее! желательно с примером в CodeVisionAVR
[uquote="ARV",url="/forum/viewtopic.php?p=3959959#p3959959"]я поседнее время делаю так: сразу после старта, еще до того, как выполнится код, очищающий всю статическую память переменных, делаю CRC-подсчет по всей доступной памяти, и это число использую в качестве параметра функции srand. поскольку после подачи питания память устанавливается в непредсказуемое значение, этот метод даёт неплохое начальное распределение случайных чисел - можете сами убедиться по моему плейеру эффектов: при каждом включении питания стартует случайный файл.[/uquote]
полностью согласен,
желательно попроще и поподробнее! желательно с примером в CodeVisionAVR
проще некуда.Serzh2000 писал(а):желательно попроще и поподробнее!
а вот с этим никак, ибо использую только avr-gcc (WinAVR).Serzh2000 писал(а):с примером в CodeVisionAVR
в общем и целом как-то так:
Код: Выделить всё
unsigned char *ptr = (void*)0;
int sum = 0;
for(int i=0; i < MAXRAM; ptr++) sum = calc_crc_1wire(sum, *ptr);
srand(sum);если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Serzh2000, как уже уже сказали - чтобы rand() не работал при каждом включении одинаково, нужно прежде srand() вызывать. При каждом включении - с новым аргументом seed.
ARV для этого seed ОЗУ вычитывает. Я в одном из своих проектов при выключении записывал результат rand () в eeprom, и использовал его как seed при следующем включении.
Да и другие варианты получения нового значения seed при включении питания вполне можно придумать.
ARV для этого seed ОЗУ вычитывает. Я в одном из своих проектов при выключении записывал результат rand () в eeprom, и использовал его как seed при следующем включении.
Да и другие варианты получения нового значения seed при включении питания вполне можно придумать.
- Сообщения: 1452
- Зарегистрирован: Вт июн 07, 2011 08:03:18
[uquote="WiseLord",url="/forum/viewtopic.php?p=3960073#p3960073"]Я в одном из своих проектов при выключении записывал результат rand () в eeprom, и использовал его как seed при следующем включении.[/uquote]
Аналогично. Наиболее просто.
Аналогично. Наиболее просто.
отнюдь, т.к. требует определенных усилий по контролю за выключением питания. мой метод не зависит ни от чего "внешнего".OKF писал(а):Наиболее просто.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1452
- Зарегистрирован: Вт июн 07, 2011 08:03:18
По включению читаем значение seed, получаем новое, сохраняем. Контроль за питанием зачем?
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
- Сообщения: 1452
- Зарегистрирован: Вт июн 07, 2011 08:03:18
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Ну это от случая конкретного применения зависит и для чего рандом применяется в общем.
Не знаю, как в теории, а на практике все мои попытки получить непредсказуемое состояние при подаче питания были неудачны, пока я не применил описанный ранее алгоритм. А пробовал я и таймер, и WDT, и АЦП... И стандартные функции... Если говорить о avr-gcc, то rand и srand в любых комбинациях там дают очень быстро узнаваемую последовательность...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 357
- Зарегистрирован: Вс янв 11, 2015 20:33:32
Всем доброго дня коллеги.
Только начал знакомство с языком Си. Есть вопросы. Вот прога, в среде Visual Studio:

Пытаюсь получить ввод этого самого конца файла, что бы вывести в консоль надпись "end file", и только после нажатия Ctrl + z, а потом нажатия клавиши Enter, получается вызвать конец файла и сообщения "end file". Простым нажатием Ctrl + z, ничего не выходит.
Так и должно быть? И при чем тут Enter ?
Только начал знакомство с языком Си. Есть вопросы. Вот прога, в среде Visual Studio:
Пытаюсь получить ввод этого самого конца файла, что бы вывести в консоль надпись "end file", и только после нажатия Ctrl + z, а потом нажатия клавиши Enter, получается вызвать конец файла и сообщения "end file". Простым нажатием Ctrl + z, ничего не выходит.
Так и должно быть? И при чем тут Enter ?
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="ARV",url="/forum/viewtopic.php?p=3960645#p3960645"]Не знаю, как в теории, а на практике все мои попытки получить непредсказуемое состояние при подаче питания были неудачны, пока я не применил описанный ранее алгоритм. А пробовал я и таймер, и WDT, и АЦП...[/uquote]
Я вон там свои экзерциссы с генерацией случайных чисел подручными способами описывал. Вполне годно получалось.
Я вон там свои экзерциссы с генерацией случайных чисел подручными способами описывал. Вполне годно получалось.


