Нравится? Делимся информацией!

четверг, 8 ноября 2012 г.

Работаем с проектом в Code Composer Studio.


    У меня стоит Code Composer v 3.3, поставляемый вместе с отладочной платой  eZdsp TMS320F28335. 




1) для создания проекта выбираем:
Project -> New вылазит 
 
Выбираем имя проекту (создается папка с таким же именем в указанном пути) (Location) : C:\CCStudio_v3.3\MyProjects\
 
Остальное как на картинке: Тип проекта - исполняемый (exe), целевая платформа - TMS320C28XX

/* ***********************    лирическое отступление  ********************************* /




Runtime library - это набор библиотек (модулей) той или иной системы программирования, поставляемых вместе с компилятором, операционной системой или средой разработки программ. Как следует из названия, RTL обеспечивает поддержку функций, предоставляемых системой программирования, во время выполнения программы от начала до её завершения.

На высоком уровне Runtime library для С28Х содержит:

  • ANSI/ISO C/C++ standard library ( The library includes functions for standard input and output, string
manipulation, dynamic memory allocation, data conversion, timekeeping, trigonometry, and exponential
and hyperbolic functions. )

  • C I/O library
  • Low-level support functions that provide I/O to the host operating system
  • Intrinsic arithmetic routines
  • System startup routine, _c_int00 ( Мы должны линковать/состыковывать наш код программы с инициализирующей и выполняющей программой, называемой программа начальной загрузки или  bootstrap routine). Она отвечает за следующие задачи:

  1. Устанавливает  status and configuration регистры
  2. Устанавливает стек и вторичный системный стек
  3. Когда используется опция компилятора --rom_model, запускает процесс автоинициализации глобальных переменных по средствам “.cinit run-time initialization table”
  4. Вызывает все глобальные конструкторы объектов (.pinit)
  5. Вызывает функцию main()
  6. вызывает/производит exit, по выполнению команды return в  main()
        Пример Вootstrap routine - это   _c_int00, расположенная в объектном файле  boot.obj в rts2800.lib.
Поэтому мы должны включать в проект RTL библиотеки.
Замечание: если используются при линковке опции  --ram_model or --rom_model , _c_int00
определяется , как входная точка для программы

  • Functions and macros that allow C/C++ to access specific instructions

            Еще помусолим runtime library ( spru514  ).  Компилятор C/C++ производит таблицы данных для
инициализации глобальных переменных. Эти таблицы инициализации используются одним из
следующих способов:
- глобальные переменные могут инициализироваться в run time (  --rom_mode опция линкера)
- глобальные переменные могут инициализироваться в  load time (  --ram_mode опция линкера )
Когда мы линкуем программу , мы должны обязательно использовать --rom_model  или
-ram_mode опцию. Эта опция указывает линковщику когда производить инициализацию.
Опция   --rom_model  - по умолчанию. Существуют следующие соглашения:

    • символ _c_int00 определен, как входная точка программы, она определяет начало С/С++ загрузочной подпрограммы (boot routine в boot.obj ). При использовании одной из опций (любой), упомянутой выше,на _c_int00 автоматически ссылаются, поэтому надо быть уверенным, что   boot.obj автоматом залинкована к проекту из run-time-support library (поэтому и надо ее подключать)
    • The initialization output section is padded with a termination record so that the loader (load-time
initialization) or the boot routine (run-time initialization) knows when to stop reading the initialization
tables.

    • Когда происходит инициализация “load time” происходит следующее:
        - Линкер устанавливает инициализируемый символ в таблице в “-1”. Это сигнализирует о том, что таблица инициализации не загружена в память, т.е. в run time  не происходило инициализации
        - The STYP_COPY flag is set in the initialization table section header. STYP_COPY is the special
attribute that tells the loader to perform autoinitialization directly and not to load the initialization
table into memory. The linker does not allocate space in memory for the initialization table

    • When autoinitializing at run time (--rom_model option), the linker defines the initialization table symbol
as the starting address of the initialization table. The boot routine uses this symbol as the starting point
for autoinitialization.
   
C28x Run-Time Support Libraries C28x Run-Time Support Libraries
Most Commonly UsedDescriptionOption Requirements
rts2800_ml.libC/C++ large memory model run-time object library
This is the library to use for the fixed-point CPU
-v28 -ml
rts2800_fpu32.libC/C++ run-time object library for FPU targets
Assumes large memory model
Can be combined with the FPU FastRTS library.
-v28 --float_support=fpu32 -ml
For C++ Exception HandlingDescriptionOption Requirements
rts2800_ml_eh.libC/C++ large memory model run-time object library with exception handling support
Note: exception handling is costly in cycles and size, even if an exception is never thrown
Only use this library if you require exception handling
-v28 -ml --exceptions
rts2800_fpu32_eh.libC/C++ run-time object library for FPU targets with exception handling support
Note: exception handling is costly in cycles and size, even if an exception is never thrown
Only use this library if you require exception handling
-v28 --float_support=fpu32 -ml --exceptions
Not Recommended
(Small Memory Model)
DescriptionOption Requirements
rts2800.libC/C++ small memory model run-time object library
It is better to use the large memory model on 28x.
-v28
rts2800_eh.libC/C++ small memory model run-time object library with exception handling support
It is better to use the large memory model on 28x.
-v28


    В том же даташите ( spru514  )читаем характеристики С++, поддерживаемые компилятором для С28х:
The C28x compiler supports C++ as defined in the ANSI/ISO/IEC 14882:1998 standard, including these
features:   
• Complete C++ standard library support, with exceptions noted below.
• Templates
• Exceptions, which are enabled with the --exceptions option;
• Run-time type information (RTTI), which can be enabled with the --rtti compiler option.

    The exceptions to the standard are as follows:
• The compiler does not support embedded C++ run-time-support libraries.
• The <complex> header and its functions are not included in the library.
• The library supports wide chars (wchar_t), in that template functions and classes that are defined for
char are also available for wchar_t. For example, wide char stream classes wios, wiostream,
wstreambuf and so on (corresponding to char classes ios, iostream, streambuf) are implemented.
However, there is no low-level file I/O for wide chars. Also, the C library interface to wide char support
(through the C++ headers <cwchar> and <cwctype>) is limited as described above in the C library.
• If the definition of an inline function contains a static variable, and it appears in multiple compilation
units (usually because it’s a member function of a class defined in a header file), the compiler
generates multiple copies of the static variable rather than resolving them to a single definition. The
compiler emits a warning (#1369) in such cases.
• Two-phase name binding in templates, as described in [tesp.res] and [temp.dep] of the standard, is not
implemented.
• The export keyword for templates is not implemented.
• A typedef of a function type cannot include member function cv-qualifiers.
• A partial specialization of a class member template cannot be added outside of the class definition.

    Q: Where is the runtime support library located?

It will be in the /lib directory of your codegen install directory.
For newer compilers this will be something like: C:\Program Files\Texas Instruments\C2000 Code Generation Tools 5.2.4

/* ****************************************************************************************************************************************** */


2) Внедрение в проект runtime support library: для CCS v3.3 (для других смотри здесь )
существует два пути:
There are two options:
  • Project->Add Files To Project, Select obj/lib, Browse to the library and add it
  • Project->Build Options->Linker->Libraries and add the RTS library. This will use the RTS library from the /lib directory of the compiler you are using.
У меня это папка по следующему пути
Будем использовать  float-point арифметику, поэтому подключаем rts2800_fpu32.lib.

3) Выбираем Linker  command file, для того, чтобы линковщик знал какую переменную помещать в какой блок памяти, знал о memory map и т.д.  
По идее, эти командные файлы пишутся ручками каждый под свое приложение/проект, но для начального старта достаточно стандартных примеров, поставляемых TI. Отыскать их можно в программном фреймворке от TI под названием C2833x/C2823x C/C++ Header Files and Peripheral Examples . Закачиваем по указанной ссылке архив sprc530.zip, и после распаковки устанавливаем по предлагаемому пути (в корень диска С) этот фреймворк. И в нем уже лежат и примеры, и командные файлы и много чего еще.
Для каждого процессора в папке представлены две версии командного файла: F28335.cmd - распределяется основные блоки памяти в Flash, т.е. может использоваться уже в отлаженном и загружаемом в прибор Release версии программы. 28335_RAM_lnk.cmd - кладет основные блоки памяти в RAM; в основном используют для отладки, т.е. в Debug версиях программы
Итак, прикрепляем к проекту:

/* ***************************************    лирическое отступление  ************************************* /
Q: Как сделать так, что бы в ССS 3. при смене конфигурации автоматически подключался другой CMD-файл ( ну, или менялось его содержимое)? А то получается, что переключился из DEBUG на RELEASE и потом ручками меняешь RAM.CMD на FLASH.CMD.                     
A1: Сделайте 2 *.cmd файла и оба подключите в проект.
Далее правый щелчек на первом *.cmd и в контекстном меню File Specific Options...->галочка exclude from Build
Затем преключаетесь в другую конфигурацию проекта и такая же самая операция для другого *.cmd
A2: Можно использовать  cmd-файл, состоящий из двух секций:
#ifdef LINK_SRAM ... #endif
и
#ifdef LINK_FLASH ... #endif

Далее для CCS3 и CCS4 немного по-разному.

Для CCS3.3: создается две конфигурации - SRAM и FLASH, ну или можно использовать стандартные DEBUG и RELEASE.
Затем для каждой конфигурации задается:
Build options->Linker->Advanced(2)->Pre-define preproc. macros (name=value) LINK_SRAM (для SRAM конфигурации) и
LINK_FLASH (для FLASH соответственно).
Для CCS4.х: тоже самое
Build Properties->C2000 Linker->Command File Preprocessing->Pre-define preprocessor macro name LINK_SRAM или LINK_FLASH для двух конфигураций.
Разница между 3.3 и 4.2 в том, что компилятор в 3.3 также видит этот макрос, что удобно например при определении необходимости перегрузки из FLASH в SRAM. Для 4.2 приходится дополнительно прописывать эти defines в:
Build Properties->C2000 Compiler->Predefined Symbols.
Очень удобно, просто выбрать нужную конфигурацию.                            
(пока не пробовал, взято отсюда )                    
/* ****************************************************************************************************************************************** */

4) Установка размера стека. (устанавливаем пока на глазок значение стека)

5) Пишем простенькую программу. Теперь можно написать собственную простую программку, но это уже другая история. 

И напоследок:

Q: What is the minimum that I need in my project to get started?

Any minimal C based project for a fixed-point 28x will have:
Any minimal C based project for a 28x with Floating-Point will have:
  • Compiler options: -v28 --float_support=fpu32 -ml -mt -g -pdr -w
  • a .c file with main()
  • run-time support library rts2800_fpu32.lib
  • Appropriate linker command file. Again the best way is to start with one provided with TI examples mentioned above.
  • Header files to facilitate programming C28x system control and peripherals. 


Дополнительная информация по настройке проекта  можно взять с сайта компоненты и технологии  и терраэлектроника
а так же сайта Texas Instruments ссылка

2 комментария: