Я хочу вычислить количество тактовых циклов для конкретной функции внутри моего кода C, который будет скомпилирован и запущен на BeagleBone Black. Я понятия не имею, как я могу это сделать. Я искал в Интернете, и я нашел эту инструкцию:
Метод считывания часов на плате Arndale:
Шаг 1. Вставьте модуль ядра, чтобы обеспечить доступ пользовательского пространства к счетчикам PMU. Разархивируйте вложенный файл «arndale_clockread.tar.bz2», в котором есть Makefile и enableccnt.c. В Makefile измените «KERNELDIR» на исходный каталог вашего ядра, например. /usr/src/linux-kernel-version
затем запустите команду.
linaro@linaro-server:~/enableccnt$ make
Вышеупомянутая команда должна выдать вывод как enableccnt.ko
, который является модулем ядра, обеспечивающим доступ пользовательского пространства к счетчикам PMU. Затем запустите команду.
linaro@linaro-server:~/enableccnt$ sudo insmod enableccnt.ko
Следующая команда должна показать, что модуль enableccnt вставляется в работающее ядро.
linaro@linaro-server:~/enableccnt$ lsmod
Шаг 2. Чтение счетчика из приложений пользовательского пространства. После установки модуля ядра. Следующая функция может быть использована для чтения счетчика
static void readticks(unsigned int *result)
{
struct timeval t;
unsigned int cc;
if (!enabled) {
// program the performance-counter control-register:
asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(17));
//enable all counters.
asm volatile("mcr p15, 0, %0, c9, c12, 1" :: "r"(0x8000000f));
//clear overflow of coutners
asm volatile("mcr p15, 0, %0, c9, c12, 3" :: "r"(0x8000000f));
enabled = 1;
}
//read the counter value.
asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(cc));
gettimeofday(&t,(struct timezone *) 0);
result[0] = cc;
result[1] = t.tv_usec;
result[2] = t.tv_sec;
}
Я считаю, что эта инструкция должна работать для любых ARMv7
платформ. Итак, я последовал инструкции и изменил исходный каталог ядра. Вот как выглядит Makefile:
KERNELDIR := /usr/src/linux-headers-3.8.13-bone70
obj-m := enableccnt.o
CROSS=arm-linux-gnueabihf-
all:
CC=arm-cortex_a15-linux-gnueabihf-gcc $(MAKE) ARCH=arm -C $(KERNELDIR) M=`pwd` CROSS_COMPILE=$(CROSS) -I/lib/arm-linux-gnueabihf/lib
Теперь, когда я запускаю make
, у меня появляется эта ошибка, которая жалуется на arm-linux-gnueabihf-ar
:
CC=arm-cortex_a08-linux-gnueabihf-gcc make ARCH=arm -C /usr/src/linux-headers-3.8.13-bone70 M=`pwd` CROSS_COMPILE=arm-linux-gnueabihf- -I/lib/arm-linux-gnueabihf/
make[1]: Entering directory `/usr/src/linux-headers-3.8.13-bone70'
LD /root/crypto_project/Arndale_enableccnt/built-in.o
/bin/sh: 1: arm-linux-gnueabihf-ar: not found
make[2]: *** [/root/crypto_project/Arndale_enableccnt/built-in.o] Error 127
make[1]: *** [_module_/root/crypto_project/Arndale_enableccnt] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.8.13-bone70'
make: *** [all] Error 2
Я пытался установить arm-linux-gnueabihf-ar
, но это не работает. Итак, я понятия не имею, что мне теперь делать!
EDIT1- Как упоминается в комментариях, я добавляю свой путь к набору инструментов в переменную среды, используя:
export PATH=/path/to/mytoolchain/bin:$PATH
И теперь я не получаю предыдущую ошибку. Однако у меня есть эта синтаксическая ошибка, которая, я думаю, связана с файлами заголовков ядра:
CC=arm-cortex_a15-linux-gnueabihf-gcc make ARCH=arm -C /usr/src/linux-headers-3.8.13-bone70 M=`pwd` CROSS_COMPILE=arm-linux-gnueabihf- -I/lib/arm-linux-gnueabihf/bin
/root/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/arm-linux-gnueabihf-gcc: 1: /root/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/arm-linux-gnueabihf-gcc: Syntax error: "(" unexpected
make[1]: Entering directory `/usr/src/linux-headers-3.8.13-bone70'
LD /root/crypto_project/Arndale_enableccnt/built-in.o
/root/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/arm-linux-gnueabihf-ar: 1: /root/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/arm-linux-gnueabihf-ar: Syntax error: "(" unexpected
make[2]: *** [/root/crypto_project/Arndale_enableccnt/built-in.o] Error 2
make[1]: *** [_module_/root/crypto_project/Arndale_enableccnt] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.8.13-bone70'
make: *** [all] Error 2
Единственное разумное решение, которое приходит мне в голову, это загрузить исходный код ядра с его заголовочными файлами и попытаться сделать это снова. У кого-нибудь есть идея решить эту проблему?
export PATH=/path/to/your/toolchain/bin:$PATH
. Затемexport CROSS_COMPILE=arm-linux-gnueabihf-
. Теперь вы можете попробовать собрать свой модуль с помощьюARCH=arm
(как и вы). - person Sam Protsenko   schedule 04.12.2015Makefile
кажется неправильным. Попробуйте изменить правилоall:
на$(MAKE) ARCH=arm -C $(KERNELDIR) M=`pwd`
. - person Sam Protsenko   schedule 05.12.2015