Свежие обсуждения
Микроконтроллеры

Поясните по Си

1 7 8

Wladimir_TS: Как сдвинуть на 1 бит вправо или влево таковой массив ? (максимально быстро само собой)

Отказаться от такой постановки задачи и использовать более эффективный алгоритм.
Поскольку цель неясна, более конкретно сказать сложно.

 

Tadas: Tadas ◊
сегодня, 11:59
Wladimir_TS: Второй - как описать такой-же массив с однозначным заданием адреса его расположения в ОЗУ микроконтроллера

В разных компиляторах способы такого описания могут немного отличаться.

AVR Studio 4.13 штатный.


Wladimir_TS: либо функцию возвращающую таковой (физический адрес в памяти данного элемента массива)

Функция как таковая тут не нужна. Делается так:

int * p; // указатель на нечто типа int ()

p=my_array; // указателю присваивается значение адреса первого элемента массива
// или
p=&my_array[13] // указателю присваивается значение адреса 13-ого элемента массива

А значение ячейки как тогда ? p=my_array[13] - это значение ячейки, а p&=my_array[13] - адрес ячейки ?


Wladimir_TS: Как сдвинуть на 1 бит вправо или влево таковой массив ?

for (i=0; i < 4095; i++) // цикл для прохода по массиву (тут вместо < должен быть зачок "меньше")
*p++=1; // сдвиг каждого элемента массива влево

А перенос бита как организовать ?

 

boo2: boo2
сегодня, 12:05 Wladimir_TS: Как сдвинуть на 1 бит вправо или влево таковой массив ? (максимально быстро само собой)

Отказаться от такой постановки задачи и использовать более эффективный алгоритм.
Поскольку цель неясна, более конкретно сказать сложно.

Таков алгоритм - надо сдвинуть на 1 бит массив данный в 32768 бит в виде 4096 байтов в ОЗУ микроконтроллера. Вправо или влево. Потом произвести некие матоперации над некими его частями, потом снова сдвинуть и так N раз за минимальное время. И на СИ (на ассемблере все работает - но ТЗ стоит - сделать на СИ).

Бит выдвигаемый из очередного байта должен вдвигаться в следующий, выдвигаемый из последнего помещаться на место первого бита первого байта.

Аналог команд ассемблера ROL, ROR только не для 8 бит в 1 регистре а для 32768 бит

 

Wladimir_TS: А значение ячейки как тогда ? p=my_array[13] - это значение ячейки, а p&=my_array[13] - адрес ячейки ?

p=&my_array[13]; // р присваиваем значение адреса ячейки 13
a=*p; // а присваиваем значение ячейки, на которую указывает р

Wladimir_TS: А перенос бита как организовать ?

Хе, так и надо было говорить о массиве битов, а не переменных.
Насчет эффективного алгоритма есть что подумать.
Попробуйте поискать - https://www.google.lt/#q=%D0%BF%D0%BE%D0%B1%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B9+...

 

Wladimir_TS: Таков алгоритм

Есть подозрение, что очень хреновый это алгоритм, наверняка нужно было делать что-то типа кольцевого битового буфера (на базе указателей голова-хвост) -- работало бы в тысячу раз быстрей.

Ну а если по тупому - для начала в гугль, как уже посоветовал Tadas.
В принципе задача тривиальна.

 

В манчестере применяется:

 

Спасибо ! Еще вопрос - просто по книгам пока не очень удается разобраться, а надо как-то смотреть переменные. Через JTAG оказывается сие малореально - походу программа под JTAG не работоспособна, только автономно, а данные выводить надо и много. Остается UART и программа терминал в компьютере.

Задача следующая (на СИ надо) преобразовать 16 разрядное число в десятичный формат, передать его через UART. Без использования прерывания по окончанию передачи - только с анализом бита TXC в UCSRA

С передачей я разберусь - а вот с преобразованием как-то сложнее.

Хотя-б как разделить 1 16 битовое число (переменную, объявленную, как unsigned int) на 2 - 8 разрядные.

Что значит "warning: suggest parentheses around assignment used as truth value" на строку "if (icr_position=7) {;" ?

 

Если ничего не делать, то sprintf Вам поможет.
http://www.cplusplus.com/reference/cstdio/sprintf/

 

Спасибо - но применение этой функции жрет почти 1 кБ памяти, и её перестаёт хватать. сейчас занято 99,9% памяти программ... Вчера вечером переписал (без UART пока) на ассемблере - занимает 308 слов...

 

Так я бы и писал на асме, а в отчёте... "Для подложек для тонкоплёночных гибридных интегральных микросхем используют ситалл, брокерит, поликор и карельскую берёзу, потому что этот курсач читать никто не будет" (С)