Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Nios II 7.1 IDE. Функции из HAL.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Волощенко
Есть желание применить функции из HAL. Вот программа, в ней вызывается функция alt_timestamp_start(), которая описана в altera_avalon_timer_ts.c.

#include "sys/alt_stdio.h"
//-----------------------------
#include "alt_types.h"
#include "system.h"
//-----------------------------
#include "altera_avalon_timer_regs.h" //for timer
#include "altera_avalon_timer_ts.c"
//-----------------------------
int main()
{alt_u32 a;
a=alt_timestamp_start();
alt_putstr("Hello from Nios II!\n");
printf("%08x, ", a);
while (1);
return 0;
}

Но при компиляции сообщается об ошибке: undefined reference to `alt_timestamp_start'.
Вопрос: Что в программе не так, и как правильно подключать функции и макросы из системной библиотеки, например, из hello_world_small_0_syslib\Device Drivers [Sopc Builder]\altera_avalon_timer\HAL\src
RHnd
Сейчас не могу проверить, но мне кажется, что подключать надо не altera_avalon_timer_ts.c, а altera_avalon_timer_ts.h
Волощенко
Цитата(RHnd @ Oct 29 2007, 19:19) *
Сейчас не могу проверить, но мне кажется, что подключать надо....

Тема не раскрыта, вопросы остались.
Альтера рекомендует функции и макросы из своих библиотек HAL. Прекрасно!
Однако, механизм работы с HAL описан слабо, а жаль.
Альтера советует писать программы, стартуя с шаблонов типа "Hello world small", с последующим их развитием.
Допустим, что в проект еще вводится таймер, как его инициализировать, сделать с ним что-то с помощью функций из HAL, как эти HAL библиотеки подключить, как будет выглядеть простейшая работающая программа в целом с этими инклудами (как выглядят пути)?
Неужели никто этот HAL еще не освоил?
Postoroniy_V
Цитата(Волощенко @ Nov 8 2007, 20:39) *
Тема не раскрыта, вопросы остались.
Альтера рекомендует функции и макросы из своих библиотек HAL. Прекрасно!
Однако, механизм работы с HAL описан слабо, а жаль.
Альтера советует писать программы, стартуя с шаблонов типа "Hello world small", с последующим их развитием.
Допустим, что в проект еще вводится таймер, как его инициализировать, сделать с ним что-то с помощью функций из HAL, как эти HAL библиотеки подключить, как будет выглядеть простейшая работающая программа в целом с этими инклудами (как выглядят пути)?
Неужели никто этот HAL еще не освоил?

вот выдрал заголовки из проекта
Код
#include <stdio.h>
#include <unistd.h>
#include <io.h>
#include <sys/alt_irq.h>

#include "alt_types.h"
#include "altera_avalon_dm9000.h"//my component and HAL
#include "altera_avalon_pio_regs.h"//

#include "system.h"
#include "socrat.h"

подключаются Халы "сами" smile.gif когда новый компонент добавляете
как использовать хал...берёте и используете smile.gif подробности в хедерах самого хала
See the Nios II Software Developer’s Handbook for details on using the
system clock and timestamp features that use these drivers. The Nios II
Embedded Design Suite (EDS) also provides several example designs
that use the timer core.
Волощенко
Цитата(Postoroniy_V @ Nov 8 2007, 17:51) *
подключаются Халы "сами" smile.gif когда новый компонент добавляете
как использовать хал...берёте и используете smile.gif подробности в хедерах самого хала
Уважаемый, Postoroniy_V!
Мой вопрос был конкретный, и я ожидал пример. В "Nios II Software Developer’s Handbook" прямых ответов на свои изыскания я не нашел, т.е. я пытаюсь на основе сведений из n2sw_nii5v2.pdf что-то сделать в части HAL, но при работе в среде Nios II 7.1 IDE постоянно натыкаюсь на errors.
Еще раз про мои вопросы:
1. Вот простейшая работающая программа Hello world small:
#include "sys/alt_stdio.h"
int main()
{ alt_putstr("Hello from Nios II!\n");
while (1);
return 0;
}
Я пытаюсь работаю с NiosII, в котором на SOPC задана конфигурация: cpu, jtag_uart, onchip_mem и timer.

2. Есть файл в C:\altera\71\ip\sopc_builder_ip\altera_avalon_timer\HAL\src\altera_avalon_timer_ts.c, в котором есть, к примеру, две интересующие меня функции:
int alt_timestamp_start(void);
alt_u32 alt_timestamp(void);

3. Предполагаю, что это функции из HAL, и хочу вставить их в программу Hello world small, что бы периодически выводит состояние таймера через stdio.

4. Как будет выглядеть работающая программа с этими функциями? Т.е. хотел бы видеть ее текст и немного разъяснений. Надеюсь, что на этом примере смогу разобраться со своими ошибками.

Спасибо за ответы.
id_gene
С этой функцией не работал, но могу предположить следующее:

В самом исходнике написано:
* These functions are only available if a timestamp device has been selected
* for this system.
Т.о. они подключаться автоматически при соответствующих параметрах таймера в СОПС-билдере.

З.Ы. после чего, рекомендую вам расковырять скрипты, заголовки и make-файлы проекта и разобраться, как он подключился.

добавлено:
в той же книге n2sw_nii5v2.pdf есть примеры работы с этими функциями. Найдите их просто поиском, или в главе про timestamp driver.
Волощенко
to id_gene Спасибо, за дополнительную информацию, буду разбираться, а пока:
Конфигурация timer взята по умолчанию и такая:
Period: 1 us
Hardware options:
Presents: Customs
Registers:
Writable period +
Readable snapshot +
Start/Stop control bits +

Пример из n2sw_nii5v2.pdf (стр.250, 251) не компилится, ошибки.

Да, еще. В http://electronix.ru/forum/index.php?showt...37321&st=15 в сообщении номер 27, сходная задача решена включением прямого описания функций int alt_timestamp_start(void) и alt_u32 alt_timestamp(void) в тело основной программы. Почему я не могу подключить их (функции) прямо из библиотеки HAL через инклуды?
id_gene
Ошибки - это плохо.
Про билдер я, похоже, поторопился, выбирать нужно в настройках сислиба.

Добавлено:
про инклуды: _подозреваю_, что область поиска файлов для инклуда (ключ gcc -include) ограничена по умолчанию только необходимыми вещами, чтобы не замусорить систему. Посмотрите, как это будет сделано через скрипты или правьте пути поиска в настройках компилятора. Навскидку ничего умнее в голову не приходит.
Читайте доки
popeye
Волощенко

Если Вы хотите использовать timestamp таймер, то нужно написать строчку:

Код
#include "sys/alt_timestamp.h"


Никаких си файлов инклюдить не надо.
Волощенко
к popeye, спасибо за ответ!
Однако, если вставить просто #include "sys/alt_timestamp.h" в текст Hello_world_small, а затем компилировать, то все будет нормально. Но если добавить в текст еще функцию extern int alt_timestamp_start (void); то будет выдано сообщение:
undefined reference to `alt_timestamp_start'

#include "sys/alt_stdio.h"
#include "sys/alt_timestamp.h"
int main()
{int t; t=alt_timestamp_start ();
alt_putstr("Hello from Nios II!\n");
while (1);
return 0;
}

То есть, надо еще что-то сделать... Я пока не знаю что...Надеюсь на солидарность Форума...
popeye
Может это глупый вопрос, а Вы код для своей alt_timestamp_start создали? biggrin.gif
Волощенко
Цитата(popeye @ Nov 10 2007, 00:12) *
Может это глупый вопрос, а Вы код для своей alt_timestamp_start создали? biggrin.gif

Функция с прототипом extern int alt_timestamp_start (void); описана в файле:
C:\altera\71\ip\sopc_builder_ip\altera_avalon_timer\HAL\src\altera_avalon_timer_ts.c
.... и является принадлежностью HAL-системы, создавать ее уже не надо, а только использовать. Но в этом и вопрос топика, как это правильно сделать.
Harbour
Если оригинальная f() описана как 'static inline' - то ничего удивительного не наблюдается.
Postoroniy_V
Цитата(Волощенко @ Nov 10 2007, 04:49) *
к popeye, спасибо за ответ!
Однако, если вставить просто #include "sys/alt_timestamp.h" в текст Hello_world_small, а затем компилировать, то все будет нормально. Но если добавить в текст еще функцию extern int alt_timestamp_start (void); то будет выдано сообщение:
undefined reference to `alt_timestamp_start'

#include "sys/alt_stdio.h"
#include "sys/alt_timestamp.h"
int main()
{int t; t=alt_timestamp_start ();
alt_putstr("Hello from Nios II!\n");
while (1);
return 0;
}

То есть, надо еще что-то сделать... Я пока не знаю что...Надеюсь на солидарность Форума...

тоесть Вы утверждаете что прочитали таки главу про Timestamp driver в Nios II Software Developer’s Handbook? Если так тогда мне совершенно не ясно почему у Вас с ошибками компилится, а у меня без ошибок
Код
Creating libhello_world_0_syslib.a...
Compiling hello_world.c...
Linking hello_world_0.elf...
Info: (hello_world_0.elf) 2032 Bytes program size (code + initialized data).
Info:                     6160 Bytes free for stack + heap.

компилил тот же исходник что и у Вас. smile.gif
Возможно что Вы не обратили внимания на строчки
1) страница 6-12
The HAL-specific API functions for accessing timer devices are defined
in sys/alt_alarm.h and sys/alt_timestamp.h.

2)6-14
Timestamp Driver
Sometimes you want to measure time intervals with a degree of accuracy
greater than that provided by HAL system clock ticks. The HAL provides
high resolution timing functions using a timestamp driver. A timestamp
driver provides a monotonically increasing counter that you can sample
to obtain timing information. The HAL only supports one timestamp
driver in the system.
You specify a hardware timer peripheral as the timestamp device by
manipulating BSP settings
. The Altera-provided timestamp driver uses
the timer that you specify.

3) чтобы сделать 2 нужно в свойствах проекта (НИОС ИДЕ) ВЫБРАТЬ ТОТ ТАЙМЕР КОТОРЫЙ БУДЕТ У ВАС тем самым timestamp

надеюсь теперь у Вас всё получится smile.gif
Волощенко
to Postoroniy_V. Спасибо за ответы!
1. Пока у меня эта программа в Nios II 7.1 IDE не получается:
#include "sys/alt_stdio.h"
#include "sys/alt_timestamp.h"
int main()
{int t; t=alt_timestamp_start ();
alt_putstr("Hello from Nios II!\n");
while (1);
return 0;
}
2. Во вторник в Киеве будет семинар от Альтеры, попробую спросить там. Все что нужно для работы с Timestamp Driver, согласно и Quartus II Version 7.1 Handbook стр.14-6, я учел. А именно: The timer core may be used as a timestamp device if it meets the following conditions:
■ The timer has a writeable period register, as configured in SOPC Builder.
■ The timer is not selected as the system clock.
т.е. эти режимы заданы еще на этапе работы в SOPC (см.пост от Nov 9 2007, 14:59). Повторюсь там только : cpu, jtag_uart, onchip_mem и timer
3. Еще вопрос. В теле alt_timestamp.h", есть строка с #ifdef __cplusplus, как Вы ее обошли? Моя попытка вставить между двумя инклудами (см.текст проги), что-то типа #define __cplusplus 1, тоже не дало результата.

to id_gene. Спасибо за ответы!
Вы писали: "Добавлено: про инклуды: _подозреваю_, что область поиска файлов для инклуда (ключ gcc -include) ограничена по умолчанию только необходимыми вещами, чтобы не замусорить систему. Посмотрите, как это будет сделано через скрипты или правьте пути поиска в настройках компилятора."
Думаю, что, действительно, искать нужно здесь, но пока не разобрался.

to All
Может уже поднадоел кому, но, думаю, что тема заслуживает того, что бы с ней разобраться. Есть, конечно, обходные варианты, и их много. Но надо попробовать на этом маленьком примере научиться работать с HAL.
Postoroniy_V
Цитата(Волощенко @ Nov 12 2007, 20:28) *
Может уже поднадоел кому, но, думаю, что тема заслуживает того, что бы с ней разобраться. Есть, конечно, обходные варианты, и их много. Но надо попробовать на этом маленьком примере научиться работать с HAL.

ну мне не надоело smile.gif повторять одно и тоже
То что Вы проделали манипуляции с таймером в сопц билдере никак не относится как этот таймер будет использоваться в софте! Тоесть - Вы должны указать в свойствах либы в ниос иде что у вас есть таймер- timer и вы его планируете использовать как stamptimer! именно как stamptimer! и ВСЁ!
никаких манипулций я с инклудами не делал!
после этого спокойно компилируте ваш тест...ДОЛЖНО ПОЛУЧИТСЯ!
если нет то - help.gif
выложу ваш-свой тестовый проект, который удачно компилируется завтра.
Удачи!
Волощенко
Цитата(Postoroniy_V @ Nov 12 2007, 17:45) *
...ДОЛЖНО ПОЛУЧИТСЯ!

Спасибо БОЛЬШОЕ, все получилось!
Вот итоговый текст
#include "sys/alt_stdio.h"
#define __cplusplus 1
#include "sys/alt_timestamp.h"
int main()
{int t; t=alt_timestamp_start ();
alt_putstr("Hello from Nios II!\n");
while (1);
return 0;
}
Postoroniy_V
Цитата(Волощенко @ Nov 13 2007, 01:20) *
Спасибо БОЛЬШОЕ, все получилось!
Вот итоговый текст
#include "sys/alt_stdio.h"
#define __cplusplus 1
#include "sys/alt_timestamp.h"
int main()
{int t; t=alt_timestamp_start ();
alt_putstr("Hello from Nios II!\n");
while (1);
return 0;
}

простите мне мою тупость smile.gif
но нахрена
Код
#define __cplusplus 1

нужен??? без него компилится всё очень замечательно
вот что у меня в свойствах системной либы установлено
Нажмите для просмотра прикрепленного файла
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.