Про Atmel

Atmel продолжает нас расстраивать.

Не так давно (пару лет всего как) корпорация Atmel наплодила нам новых микроконтроллеров  сделанных из старых и на замену, в их числе оказались заменены наши не любимые, но уже привычные AtXmega128A1  и Atmega32.

Читать далее

Похожий бред:

SAM9G45 почему?

В продолжении поста об этом и вот этом.  Хотим рассказать чуть-чуть себе и нашим читателям почему и зачем мы собираемся прекратить использование плат на процессорах архитектуры Intel (Российского производства). Пока это касается только наших проектов в области энергетики, а дальше посмотрим. Процессорная плата сопоставимая по стоимости с дизельным двигателем это не то, что необходимо российским ВС в XXI веке. Читать далее

Похожий бред:

RS-485 на AVR32

Как известно, в своих новых микроконтроллерных разработках КБ 13 отказалось от старой проверенной АтМеги в пользу гипернанотехнологичных процессоров AVR32.

В процессе работы с этими процессорами, мы столкнулись с различными багами. Что, в принципе, неудивительно при плотном общении с любой «новинкой»…

Один из багов был связан с usart в режиме rs-485. Читать далее

Похожий бред:

Баги с memcpy в AVR32

В процессе игр с атмелевской новинкой at32uc3a натолкнулись на интересное.
При объявлении глобального массива (или структуры) в начале программы (где-нить в районе мэйна — т.е., в итоге, по небольшим адрискам) и последующей попытке с-memcpy-ать в нее что-нибудь, проц ведет себя малость неадекватно.
Либо виснет, либо контроллеры периферии начинают глючить — неправильное чтение сдрама, висы усарта…
Небольшое гугленье показало,что мы не первые с этой проблемой — на электрониксе о таком уже писали:

Ковыряя пример работы с Ethernet ’ом (macb_example.c) для AT32UC3A0512, столкнулся с зависанием программы на функциях memcpy и подобных.
При замене этих функций простыми циклами for – все начинает работать.

И даже описали решение проблемы:

После некоторых изысканий удалось выяснить, что для правильной работы этих функций необходимо указать опцию линкера -march=ucr2
(по-умолчанию было -march=ucr1 ).
В AVR32 Studio эта опция находится:
Project -> Properties -> C/C++Build -> Settings -> Tool Settings -> AVR32/GNU C Linker -> Miscellaneous -> Linker Flags

Мы, правда, просто избавились от глобальных переменных — до чего иначе руки бы, наверное, так и не дошли.

Похожий бред:

swapBytes()

В продолжение.
Таки созрели написать нормальную функцию-конвертер

/*
* swapBytes() - конвертирует порядок байт в буфере
* num - приведенный указатель на число
* n - размер в байтах
*/
int swapBytes(unsigned char * num, size_t n)
{
unsigned char tmp[n];
size_t cnt = n-1;

memcpy(tmp, num, n);

for(cnt=0; cnt

Похожий бред:

Про порядок байт

Сопрягая разные железки, никогда не стоит забывать, что у каждого производителя свое королевство со своими правилами.
Если на AVR32 порядок байт — big-endian, то на x86 — интеловский, little-endian.
И, к примеру, тупо заслав от АЦП на cpc108 буфер unsigned short значений каналов, мы получим на процессоре совсем не то, что хотелось бы.
Магическая функция по конвертации из big-endian в little-endian нам поможет.

/*******************************************************************************
* sw16 - перевод 16-бит числа из Big Endian в Little Endian.
* 
* INPUTS: item - значение для перевода.
*
* RETURNS: переведенное 16-бит значение
*/

UINT16 sw16(UINT16 item)
    {
    UINT16 temp = 0x0;
    
    memcpy( (U8 *)&temp+1, (U8 *)&item, 1);
    memcpy( (U8 *)&temp, (U8 *)&item+1, 1);
    
    return (temp);
    }

Похожий бред:

Как мы лишний байт в USART-е искали

Обнаружилась в АЦП нашем магия такая чуднАя — время от времени приходит от него на один байт больше, чем надо. Всегда в одном и том же месте, да один и тот же байт — r. Вот оно как.
Колдунство это гадкое данные зело портило, и сумма контрольная сходилась плохо. Никак даже не сходилась, эх…

Грешили сначала на плату фаствеловскую cpc108. Потом на рс, как это повелось у нас. Но нет, вроде все в порядке полном оказалось.

Почесали коллеги лики бородатые и взяли прибор от сглаза всякого помогающий — сцылограф…
Читать далее

Похожий бред:

Photon и массивы указателей.

Есть в фотоне такой виджет — PtList.
Собственно, предоставляет те же возможности, что и компонент с подобным названием в любой другой среде: формирование списков, получение индекса выбранных элементов и т.п.
Ну и, естественно, фотоновская фишка — создание на его основе других виджетов, наследующих те же свойства и возможности.

Как добавить в уже созданный экземпляр PtList список элементов? QSSL заботится о Вас! Для этого есть специальная функция — PtListAddItems():

int PtListAddItems( PtWidget_t *widget,
                    const char **items,
                    int item_count,
                    unsigned int position );

В качестве списка строк эта функция принимает переменную типа const char **, и вот тут могут возникнуть проблемы.

Предположим, что наше приложение, создающее ГУИ, получает данные для инициализации откуда-либо извне.

В том числе, извне приходит и массив строк, который должен быть помещен в PtList.

Т.е. имеем нечто вроде такого кода:

char itemsList[20][20];

void
init_read(void* arg){
	int fd;

    fd = open(GUI_PORT, O_RDONLY | O_NOCTTY );

    if (fd == -1){
      	perror("nopen() failed! ");
		return( 0 );
    } else {
	read(fd,itemsList,400);
	}
close(fd);
}

После выполнения которого itemsList указывает на 20 хороших, годных строк, завершенных терминаторами, которые, как некоторые считают, можно бы сразу пихать в PtListAddItems:

PtListAddItems( widget, (const char **)itemsList,20,1);

Не беда даже несходство типов — фокусы с приведением спасают риальне джыгитов от надоедливых варнингов в любой ситуации. После запуска можно посмотреть, как приложение погибает с SIGSEGV.

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

Для двух следующих определений:

int a[20][20];
int *b[20];

записи a[3][4] и b[3][4] будут синтаксически правильным обращением к некоторому значению типа int.

Однако только a является двумерным массивом: для четырехсот элементов типа int будет выделена память, а вычисление смещения элемента a[строка][столбец] от начала массива будет вестись по формуле 20 * строка + столбец, учитывающей его прямоугольную природу.

Для b же определено только 20 указателей, причем без инициализации. Инициализация должна задаваться явно — либо статически, либо в программе. Важное преимущество массива указателей в том, что строки такого массива могут иметь разные длины.

Так вот, PtListAddItems ждет массив указателей, который мы ей и передадим с небольшим вывертом:

void set_list(){
    char itemsList[20][20];
    char *items[20];
    int i;

    for( i=0; i<20; i++ ){
      items[i] = itemsList[i];
   }

   PtListAddItems( widget, (const char **),20,1);
}

Фотон в этом случае получает 20 идущих подряд указателей на строки, а мы — работающий виджет.

Похожий бред:

Система качества Мегакорпорации

Существуют различные системы качества типа Оборонсертифика или ИСО. Понятно, что наличие у нас данных сертификатов не говорит заказчику ни о чем — за ними может скрываться многое, а может и ничего. Да и не дело Инженеров обсуждать эти бюрократические, но несомненно важные для нашей Мегакорпорации бумаги. Наше дело — закупить, запрограммировать или спроектировать уникальное оборудования, для обеспечения стопроцентого контроля и тестирования аппаратно-программных комплексов.

Итак, чтобы наши железячки служили 5-25 лет на обьектах, а наши программки бодро работали, в Мегакорпорации существуют всяческие отделы, проектирующие спецустройства. Эти устройства служат для проверки как отдельных частей компьютерных систем управления, так и для проверки всего комплекса на протяжении длительного времени под воздействием расширенных температур, влаги, вибрации и магнитных волн.

И, конечно же, после проектирования такого устройства все отделы бегут куда? Правильно — в КБ13! Получить красивый интерфейс и программу управления, для того чтобы даже наша уборщица могла протестировать и проверить все устройства без присутствия светил. И обычно ожидаемый результат получается.

В дальнейших статьях из цикла «качество» мы расскажем про три наших последних разработки — три тестовых комплекса (аналого-цифровой под Windows, аналого-цифровой универсальный для всей линейки продуктов Мегакорпорации под QNX, c мощнейшей системой конфигурирования и моделирования для в т.ч. вновь проектируемых систем, и самый мощный и наукоемкий комплекс, который имитирует всех абонентов корабля, и проверяет целостность кабелей и каналов разрабатываемых нами корабельных систем во всех их режимах). Есть и другие разработки, но они сделаны в рамках НИОКР и проданы другим предприятиям для обеспечения качества уже их продукции…

Но в данной статье мы опишем другое простейшее, но очень нужное устройство. Читать далее

Похожий бред:

USART и частота

Забажил USART в режиме RS485. Непонятненько так забажил — то прерывания выдает, то не выдает, но стабильно забивает выделенный под прием буфер единичками.
Хорошо, что в буфере было сделано циклическое заполнение — до конца дошел, загоняйся с начала, а то программа падала бы без объяснения причин…

Читать далее

Похожий бред: