32bit_me: (Default)
Прочитал "Safety Manual for RM48x Hercules ARM-Based Safety Critical Microcontrollers User's Guide", 121 стр. англ. язык.
Микроконтроллер семейства TI Hercules на ядре ARM Cortex R предназначен для построения систем, сертифицированных по стандарту функциональной безопасности IEC 61508 (SIL3).
32bit_me: (Default)
 Был на конференции разработчиков, было много интересных докладов, как по железу, так и по программированию.
Рассказывали о разных одноплатниках нашего производства. В основном на TI, например, на процессоре Sitara AM5728 (двухъядерный Cortex A15), но есть и на других чипах, например, на Xilinx Zynq 7015.
Ещё рассказывали про наши ПЛК и прочее разное.




32bit_me: (Default)
Прочитал ARM Application Note 273 "Dhrystone Benchmarking for ARM Cortex Processors ", 12 стр. англ. язык.
Руководство описывает метод измерения производительности ядра процессора с помощью теста Dhrystone.


Разумеется, аналогичным способом может быть измерена производительность не только процессора с ядром ARM, но и процессора с другой архитектурой, работающего как под управлением операционной системы, так и в bare-metal режиме.
Также посмотрел исходный текст Dhrystone. Единственное, что вызывает опасения, это то, что оптимизатор может удалить из него много всего, что повлияет на результат. Надо будет попробовать скомпилировать и посмотреть код на выходе.
32bit_me: (Default)
В блоге PVS-Studio можно найти много примеров ошибок, совершаемых программистами, и много рекомендаций о том, как их избежать (http://www.viva64.com/ru/b/0391/).

Первый совет в этом документе: не берите на себя работу компилятора. Не оптимизируйте вручную то, что и так будет оптимизировано. В качестве примера приведён код из MySQL, в котором программист вручную развернул цикл, допустив при этом ошибку. Далее в статье написано, что если написать эту же функцию через цикл, то компилятор, скорее всего, её развернёт.
Давайте проверим это с помощью онлайн-компилятора. Я скопировал исходники функции из статьи, лишь немного подправив их так, чтобы они компилировались без дополнительных файлов.
Read more... )
32bit_me: (Default)
Если вы сомневаетесь, как будет оптимизирован тот или иной исходник, и хотите увидеть результат компиляции для разных платформ и разных компиляторов, то вот исключительно полезная ссылка: https://gcc.godbolt.org/. Компиляторы gcc, clang, icc разных версий, платформы x86-64, arm, arm64, mips, ppc. Язык С++.
32bit_me: (Default)
Рассмотрим пример того, как поднять виртуальный COM-порт на микроконтроллере STM32, и навеки забыть про б-гомерзкую FTDI.



Read more... )
32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Продолжаю эксперименты с Altera Cyclone V. На этот раз объектом эксперимента стал драйвер для той прошивки FPGA, про которую я писал ранее. Сама прошивка простейшая: она просто мигает светодиодами с частотой, которую можно задавать программно. В прошлом посте на эту тему я сделал управление частотой мигания из обычной (user-space) программы, которая получает доступ к физической памяти через функции open(«/dev/mem») и mmap().
Однако такой путь считается «hacky and unsafe». Поэтому следующим логичным шагом должно стать написание драйвера.

Tux-linux-and-ARM-multiplatform-support

Я воспользовался готовым исходником драйвера (ссылка) за авторством Howard Mao (он на самом деле не Howard, а Zhe Hao Mao). Конечно, для того, чтобы разобраться в работе кода, почитал отдельные главы книги Linux Device Drivers (есть русский перевод).

Для компиляции пришлось вытаскивать архив Arrow SocKit 13.1 GSRD Linux отсюда: http://releases.rocketboards.org/release/2013.11/gsrd/src, файл linux-socfpga-gsrd-13.1-src.bsx. Объем архива около 1.1 Гб, но сервер очень медленный, качается несколько часов. Честно говоря, я впервые увидел файл с расширением bsx, оказалось, что это самораспаковывающийся архив. Просто запускаем его и он разворачивается в указанную папку. В ней в папке sources находится файл linux-socfpga.tgz. Его тоже нужно распаковать, естественно. Это и есть как таковое ядро системы, которое нужно указывать при компиляции драйвера.

Однако всё не так просто. После компиляции записываем скомпилированный драйвер blinker.ko на SD-карту, после загрузки Linux пишем insmod blinker.ko и получаем следующее: «blinker: version magic ’3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8 ‘ should be ’3.9.0 SMP mod_unload ARMv7 p2v8′«. Не совпали волшебные номерки. Причем версия одна и та же, просто зачем-то к ней приделан какой-то добавочный номер.

Решений может быть три: 1. Скомпилировать Linux именно их этого скачанного исходника (очень неохота) или 2. Подправить номер в исходниках ядра Linux. 3. Использовать команду modprobe с ключом -f, который заставляет систему игнорировать «волшебные цифры».  Однако этот способ почему-то не заработал.
Итак, способ номер 2, подправить номер в исходнике ядра. Данный номер записан в файле /include/generated/utsrelease.h. Исправляем то, что там было, на «3.9.0″, и перекомпилируем драйвер. На всякий случай смотрим hex-редактором файл blinker.ko, чтобы убедиться, что волшебные циферки такие, как нужно. Снова записываем драйвер на SD-карту, запускаем insmod, всё прошло гладко. Теперь можно проверить работу драйвера, посылая ему числа от 1 до 15 для управления частотой миганий: echo 1 > blinker — мигает быстро, echo 15 > blinker — мигает медленно. Пока всё. Немного, но путь в тысячу ли начинается с одного шага.

Эксперименты продолжаются.

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Приведённый ниже код писал не я, он взят отсюда: https://zhehaomao.com/blog/fpga/2013/12/27/sockit-3.html, но я решил оставить его здесь, т.к. он пригодится для дальнейших экспериментов.

Напоминаю, что данная программа работает в ОС Linux GSRD на SoC Altera Cyclone V (ядро ARM Cortex A9). Компилятор Linaro GCC, берём здесь: http://releases.linaro.org/latest/components/toolchain/binaries/4.8/arm-linux-gnueabihf/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <sys/mman.h>;
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
 
#define PAGE_SIZE 4096
#define LWHPS2FPGA_BRIDGE_BASE 0xff200000
#define BLINK_OFFSET 0x0
 
volatile unsigned char *blink_mem;
void *bridge_map;
 
int main(int argc, char *argv[])
{
	int fd, ret = EXIT_FAILURE;
	unsigned char value;
	off_t blink_base = LWHPS2FPGA_BRIDGE_BASE;
 
	if (argc < 2) {
		fprintf(stderr, "Usage: %s number\n", argv[0]);
		exit(EXIT_FAILURE);
	}
 
	/* check the bounds of the value being set */
	value = atoi(argv[1]);
	if (value < 1 || value > 15) {
		fprintf(stderr, "Invalid delay setting."
				"Delay must be between 1 and 15, inclusive.\n");
		exit(EXIT_FAILURE);
	}
 
	/* open the memory device file */
	fd = open("/dev/mem", O_RDWR|O_SYNC);
	if (fd < 0) {
		perror("open");
		exit(EXIT_FAILURE);
	}
 
	/* map the LWHPS2FPGA bridge into process memory */
	bridge_map = mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED,
				fd, blink_base);
	if (bridge_map == MAP_FAILED) {
		perror("mmap");
		goto cleanup;
	}
 
	/* get the delay_ctrl peripheral's base address */
	blink_mem = (unsigned char *) (bridge_map + BLINK_OFFSET);
 
	/* write the value */
	*blink_mem = value;
 
	if (munmap(bridge_map, PAGE_SIZE) < 0) {
		perror("munmap");
		goto cleanup;
	}
 
	ret = 0;
 
cleanup:
	close(fd);
	return ret;
}

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

Read the rest of this entry »

32bit_me: (Default)
Существуют готовые образы SD-карты для Altera Cyclone V с разными сборками Linux, но мы же не ищем лёгких путей.
Собрал kernel из исходников, накатил на карту, записал bootloader. Процесс довольно сложный, надо сказать, потратил на него почти весь день. То есть не на сам процесс, а на разные разбирательства "что я сделал не так". В итоге ядро загрузилось, но голое ядро без всего, это довольно унылое зрелище, поэтому скриншотов приводить не буду.

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Прочитал и освоил на практике воркбенч SoCKit Lab, две части, Hardware и Software.

Данная программа лабораторных работ основана на системе на кристалле (SoC) Altera Cyclone V. SoC состоит из двух процессорных ядер ARM Cortex A9 и FPGA, которые соединены мостами и могут взаимодействовать друг с другом. Первое руководство, Hardware, выполняется в Quartus II, и описывает конфигурирование и подключение периферии к процессору, а также симуляцию системы в ModelSim.

Вторая часть, Software, описывает процесс загрузки Linux, компиляцию простейшей программы (мигание светодиодом), отладку программы в ARM DS-5 Embedded Development Suite, и основы работы с SignalTap II Logic Analyzer в режиме совместной отладки программного кода и FPGA-проекта.


pic1

Надо сказать, что это совсем не просто, и все лабораторные работы получилось далеко не с первого раза. Но тем они и интересны.

PS: где скачать: http://rocketboards.org/foswiki/Documentation/ArrowSoCKitEvaluationBoard, здесь куча материалов по SoCKit, в том числе zip-ы

SoCKIT_Materials_13.1.zip, SoCKIT_Materials_14.0.zip, SoCKIT_Materials_14.1.zip. Скачиваем, распаковываем, там лежат pdf-ы с описанием лабораторных и с файлами проектов Quartus II, DS-5, Signal Tap II и пр. Они отличаются, в зависимости от версии Quartus II. Я делал для версии 14.0.
32bit_me: (Default)

Дочитал книгу «The Zynq Book», руководство по системе на кристалле (SoC) Zynq-7000 фирмы Xilinx.

Напомню, что Zynq-7000 состоит из двух ядер ARM Cortex A9 и блока программируемой логики PL (по сути, встроенная в систему FPGA).

В книге подробно рассматривается структура системы, программный пакет Vivado, предназначенный для разработки под Zynq-7000, подробно рассматривается процесс преобразования кода на языке высокого уровня (например, С) в форму RTL, предназначенную для конфигурирования PL . Эта возможность обеспечивается программой Vivado HLS.
В последней части книги кратко описывается структура и процедура загрузки Linux в память.

ZynqPerspective
Интересная книга, интересный процессор.

32bit_me: (Default)

Запись опубликована 32 bit.me. You can comment here or there.

Для бэкапа содержимого жесткого диска в OS X, как известно, используется приложение Time Machine, очень удобное и качественное. Однако для его работы нужно устройство Time Capsule. В этом посте я хочу рассказать о том, как я сделал свою Time Capsule на основе Raspberry Pi.

Итак, нам понадобятся следующие компоненты:

1. Raspberry Pi и SD-карта для него;

2. HDD (я использовал HDD на 1 Tb, но можно взять жесткий диск и другого объёма);

3. переходник USB-SATA (от коробки для внешнего диска);

4. источник питания с напряжениями +5В и +12В, который может обеспечить силу тока по каналу +5В не менее 1,7А, по каналу 12В не менее 0,6А;

5. Wi-Fi адаптер для USB;

6. вентилятор (я использовал вентилятор 40 мм);

7. корпус;

Собираем всё вместе:

(все картинки кликабельны)

Читать запись полностью »

32bit_me: (Default)

Запись опубликована 32 bit.me. You can comment here or there.

На основе платы  Raspberry Pi (процессор Broadcom BCM2835 700 MHz ARM11 ARM1176JZF-S) сделал такое устройство, для удобства работы с платой и подключения к Raspberry Pi других устройств.

Плата Rasperry Pi.

Фото устройства. (Картинка кликабельна)

На Raspberry Pi установлена операционная система Debian Wheezy.

Подробнее можно прочитать здесь.

 

32bit_me: (Default)

Запись опубликована 32 bit.me. You can comment here or there.

Перепост с Хабрахабра:

Добрый день, хабр. Сегодня я хотел бы поделиться некоторым опытом, касающимся подключения цветных LCD-индикаторов к микроконтроллеру. Эта тема уже поднималась на хабре (http://habrahabr.ru/post/139384/), поэтому данный пост может рассматриваться как дополнение к уже написанному моими уважаемыми коллегами.

Читать далее:   http://habrahabr.ru/post/140415/

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Интерфейс прибора реализован на базе монохромного индикатора разрешением 128х64, и включает в себя 35 различных экранов, в которых выполняются все манипуляции с прибором, включая его наладку и тестирование всех узлов (ЦАП, АЦП, все дискретные входы и выходы), установку параметров алгоритма обработки сигналов (DSP), а также все переменные настройки прибора (более 200 переменных).

Программно интерфейс реализован в виде библиотеки классов C++, представляющих элементы управления (кнопки, поля ввода, текстовые поля и пр.)

Так это выглядит в натуральном виде:

Ещё  несколько картинок под катом.

Read the rest of this entry »

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Фотография старого прибора, для которого я разрабатывал прошивку.

Кроме разработки программного обеспечения, я также отлаживал некоторые узлы прибора, принимал участие в испытаниях, а также частично разрабатывал документацию на прибор.

Прибор содержит микроконтроллер с ядром ARM7 (фирмы Atmel), и имеет 8 каналов АЦП (16 бит), 8 каналов ЦАП (12 бит), 16 дискретных входов, 16 дискретных выходов, 2 силовых выхода управления ТЭНами, интерфейсы RS-232 и RS-485 (протокол Modbus). Все входы и выходы прибора имеют гальваническую изоляцию друг от друга.

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

В предыдущей части (http://32bit.me/?p=842) были рассмотрены основные функции работы с прерываниями микроконтроллера LPC17хх. Однако, рассмотренные функции не работают с особым видом прерываний ядра Cortex M3 – системными исключениями. Ниже будет рассмотрена работа с системными исключениями на примере системного исключения SysTick. Также будет рассмотрено одно исключение из тех правил работы с прерываниями, которые рассматривались в части 2.

Read the rest of this entry »

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

В первой части (http://32bit.me/?p=839) были приведены некоторые сведения о структуре контроллера прерываний Cortex M3. В этой части будут рассматриваться примеры обработки прерываний в этой архитектуре.

Read the rest of this entry »

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

По сравнению с микроконтроллерами ARM7, такими как LPC2368, в архитектуре Cortex M3 наибольшей модернизации подверглась система прерываний. Она стала существенно более сложной и гибкой. Ниже будут рассмотрены некоторые особенности нового контроллера прерываний (Nested Vectored Interrupt Controller, NVIC).

Read the rest of this entry »

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Repetitive Interrupt Timer (RIT) является ещё одним таймером, которого не было в ARM7, и который появился в Cortex M3. Как следует из названия, он предназначен для генерации прерываний, повторяющихся через определённые промежутки времени. Его структура намного проще, чем у обычного таймера-счётчика, но несколько сложнее, чем у SysTick, рассмотренного здесь: http://32bit.me/?p=796. В большинстве практических случаев эти таймеры взаимозаменяемы.
Ниже будет рассмотрено применение таймера RIT.

Read the rest of this entry »

Profile

32bit_me: (Default)
32bit_me

July 2017

S M T W T F S
      1
2345678
9101112131415
16171819202122
232425262728 29
3031     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 25th, 2017 09:47 am
Powered by Dreamwidth Studios