LPCXpresso Урок 3. Повторное использование кода. Подключаем библиотеку.

В этом уроке рассмотрены базовые сведения по подключению сторонних библиотек к своему проекты в среде от CodeRed на примере библиотеки LPC13xx_Lib. Учимся мигать светодиодом на высоком уровне. Продолжаем повествование курса для новичков.

Подключение библиотеки

Что бы нам самим не думать, какие есть регистры и что с ними надо делать, будем использовать библиотеку для LPC1343 от NXP. Для этого в контекстном меню проекта (правый клик мышкой в дереве проектов) выбираем пункт Properties...
Контекстное меню проекта

В открывшемся окне на закладке Project References ставим флажок возле LPC13xx_Lib. Жмем Ok. Если такой записи у вас нет, то вы просто не экспортировали пример, как было описано в первом уроке.
Страница зависимостей проекта в окне свойств проекта

Это нужно что бы при открытии нашего проекта открывались так же и проекты (в данном случае проект библиотеки), от которых наш проект зависит. Как видите, CMSIS уже имеется здесь.

Далее нам надо объяснить компилятору, где ему искать заголовочные файла от используемой нами библиотеки. Для этого в группе C/C++ General выбираем элемент Path and Symbols открываем закладку Includes. В столбце Languages выбираем GNU C и жмем кнопку Add.... В появившемся окне нажимаем Workspace... и выбираем LPC13xx_Lib/inc. Не забудьте проОКать 2 раза.
Добавление пути к заголовочным файлам библиотеки в окне свойств проекта

Далее объясняем, где искать саму библиотеку. Для этого на закладке Library Paths жмём Add... в появившемся окне Workspace... и выбираем LPC13xx_Lib/Debug, у нас же дебаг версия проекта (о чем говорит поле Configuration со значением Debug [Active]). Если такого пути у вас ещё нет, то дополните его в окне редактирования самостоятельно. Путь появляется после сборки проекта библиотеки.
Добавление пути к библиотеке в окне свойств проекта

Ну и говорим, что мы будем использовать библиотеку LPC13xx_Lib. Для этого в группе C/C++ Build выбираем Settings и закладку Tool Settings. На ней в группе MCU Linker выбираем Libraries. Тут, как видите, уже имеется путь к библиотеке в нижнем окне-списке (и добавить его тоже можно было отсюда). Нам осталось в верхнем окне-списке добавить саму библиотеку. Жмем кнопку Add... и вводим LPC13xx_Lib
Добавление библиотеки в окне свойств проекта

По завершении всех деяний жмем OK. Желающие могут провести аналогичные действия для Release конфигурации.

Кстати. В промежутках можно жать Apply для подтверждения внесённых изменений без закрытия окна. При этом вас могут спросить «Желаете ли вы пересобрать проект?». Тут уж как желаете, я обычно отказываюсь и потом перекомпилирую проект после закрытия окна.

Набираем код

Вносим свои пять копеек в проект. Редактируем файл main.c до получения следующего:

#ifdef __USE_CMSIS
#include "LPC13xx.h"
#endif

// TODO: insert other include files here
#include "gpio.h"

// LPCXpresso processor card LED
#define LED_PORT 0		// Port for led
#define LED_BIT 7		// Bit on port for led
#define LED_ON 1		// Level to set port to turn on led
#define LED_OFF 0		// Level to set port to turn off led

// TODO: insert other definitions and declarations here
void delay_ms(int ms) {
	while(ms--) {
		volatile int i = 5000;
		while(i--);
	}
}

int main(void) {
	// TODO: insert code here
	GPIOInit();
	GPIOSetDir(LED_PORT, LED_BIT, 1);

	while(1) {
		GPIOSetValue(LED_PORT, LED_BIT, LED_ON);
		delay_ms(500);
		GPIOSetValue(LED_PORT, LED_BIT, LED_OFF);
		delay_ms(500);
	}
	return 0 ;
}

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

Что ж, мне этот код нравится (за исключением задержки, ей займемся позже). Код отражает алгоритм работы программы и легко читается. В нем нет явной зависимости от оборудования, на котором он должен выполнятся. Это ещё один плюс от использования библиотек.

Собираем проект

Собираем проект, как уже было описано, и если всё прошло хорошо, то получаем результат:
Результат сборки проекта с использованием библиотеки

Теперь можно снова приступать к отладке.

Ошибки сборки

Если вдруг получите ошибку что gpio.h не найден, то вы неправильно указали путь к заголовочным файлам библиотеки.

Если вы получили вдруг что-то наподобие этого:

G:\arm\workspace\blinky\Debug/../src/main.c:34: undefined reference to `GPIOInit' G:\arm\workspace\blinky\Debug/../src/main.c:35: undefined reference to `GPIOSetDir' G:\arm\workspace\blinky\Debug/../src/main.c:38: undefined reference to `GPIOSetValue' G:\arm\workspace\blinky\Debug/../src/main.c:40: undefined reference to `GPIOSetValue' collect2: ld returned 1 exit status make: *** [blinky.axf] Error 1
То просто компилятор не смог найти библиотеку LPC13xx_Lib. Вероятно, вы просто не указали, что её надо использовать. Проверьте правильность указания пути к ней и её самой в настройках проекта.

Debug/Release

Как уже было отмечено, имеется 2 версии проекта: отладочная и релиз. И подключение библиотек идет по отдельности для каждой из них. Это нужно для того, что бы в разных версиях вы могли использовать разные библиотеки. Либо же, что бы брались они из разных мест. Если такого поведения не требуется, то смело можно в Configuration выбрать [ All configurations ] и изменения отразятся на всех вариантах сборки.

Статистика

В общем случае размер кода различается примерно в 2 раза (очень сильно зависит от используемых средств). Но в данном конкретном случае получили следующее:
Дебаг версия - 3104 байта
Релиз версия - 2480 байта
Причем большую часть занимает инициализация и прочие служебные функции.

Зачем эта статистика? А просто для любителей считать байты кода.

Вместо заключения

Зачем я дал столь сложный материал как библиотеки в начале курса? Ведь во всех книгах по программированию использование библиотек идет «после середины».

Во-первых, библиотеки позволяют нам очень сильно упростить изучение контроллера. Библиотеки уже написаны, нам остаётся их только использовать.

Во-вторых, приучив себя писать «модульные» проекты сразу, мы получаем возможность использовать написанные нами же «модули» в других своих проектах, и при этом не надо копировать код/файлы из проекта в проект.

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

Файлы: blinky_withlib.zip

Hosted by uCoz