реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> strtok не работает (STM32), линкер ругается
lisstret
сообщение May 29 2013, 03:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 10-06-10
Из: Владивосток
Пользователь №: 57 835



Вообщем смысл следующий, пишу типа:

Код
#include "stm32F10x.h"
#include <stdio.h>
#include <string.h>

int main()
{
      char* pString = strtok("Main\n", "\n");
      while(1);
}


выплывает ошибка:
Код
sbrkr.c:(.text+0x12): undefined reference to `_sbrk'


Не пойму, то ли в опциях проекта надо указать линковщику "какую-то" библиотеку, то ли свои заглушки писать, то ли забить на использование стандартной библиотеки С вообще. Так как ее тут походу нету? Про STM32 вообще почти ничего не знаю, так балуюсь с с платкой VLDISCOVERY. Если что, то пользуюсь Eclipsом. Проект настраивал как написано здесь:

http://robocraft.ru/blog/ARM/653.html

Если лень туда лезть, то пользуюсь вот этим:

- Eclipse IDE for C/C++ Developers, Version: Helios Service Release 1, Build id: 20100917-0705
- Сodesourcery arm-none-eabi/4.4.1
- Ну и какими то плагинами и приблудами для эклипса laughing.gif Не разбираюсь в их названиях и т.д.)
- Платка stm32VlDiscovery

Просто не в первый раз уже так, пробываю воспользоваться какой-нить обычной функцией, например: strtok, printf и т.д. И в результате выкатывает одно и тоже. Если нужно что-то еще дописать, какие опции в проекте включены, ключи и т.д. я напишу. Я просто не знаю что еще указать.
Go to the top of the page
 
+Quote Post
skripach
сообщение May 29 2013, 06:50
Сообщение #2


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Строка должна быть в озу, а не во флеши, посмотрите как работает strtok.
но ошибка наверно не из-за этого.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 29 2013, 07:03
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(lisstret @ May 29 2013, 07:31) *

введите в строке поиска google
Цитата
site:electronix.ru sbrk


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
lisstret
сообщение May 31 2013, 02:33
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 10-06-10
Из: Владивосток
Пользователь №: 57 835



Вообщем воспользовался поиском по sbrk. Понял что для использования стандартной библиотеки требуется написать свои функции _sbrk, _write, _read и т.д. Недолго думая создал исполнительный файл syscall.c, добавил в проект. И короче закопипастил код отсюда: https://sites.google.com/site/stm32discover...rcery-lite-eabi

на всякий случай вот он:
Код
/*
* newlib_stubs.c
*
*  Created on: 2 Nov 2010
*      Author: nanoage.co.uk
*/
#include <errno.h>
#include <sys/stat.h>
#include <sys/times.h>
#include <sys/unistd.h>
#include "stm32f10x_usart.h"

...

#undef errno
extern int errno;

...

/*
sbrk
Increase program data space.
Malloc and related functions depend on this
*/
caddr_t _sbrk(int incr) {

    extern char _ebss; // Defined by the linker
    static char *heap_end;
    char *prev_heap_end;

    if (heap_end == 0) {
        heap_end = &_ebss;
    }
    prev_heap_end = heap_end;

char * stack = (char*) __get_MSP();
     if (heap_end + incr >  stack)
     {
         _write (STDERR_FILENO, "Heap and stack collision\n", 25);
         errno = ENOMEM;
         return  (caddr_t) -1;
         //abort ();
     }

    heap_end += incr;
    return (caddr_t) prev_heap_end;
}

...


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

Код
      char* pText = "Main\nMenu";
      char* pString = strtok(pText, "\n");
      lcd_out(pString);


В результате никаких символов вообще не выводится. Но если допустим будет вот так:

Код
     char* pText = "Main Menu";
     char* pString = strtok(pText, "\n");
     lcd_out(pString);


Все нормально, на экранчике который я подцепил печатается в одной строке Main Menu.

Подумал что реализация _sbrk косячная, взял еще несколько примеров, например отсюда: http://we.easyelectronics.ru/STM32/ispolzu...dlya-stm32.html , но результат такой же.

Подскажите, куда дальше то стоит копать? Возможно ли это, с неправильным выделением места для кучи, стека и т.д.?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 31 2013, 06:23
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(lisstret @ May 31 2013, 06:33) *
Подскажите, куда дальше то стоит копать? Возможно ли это, с неправильным выделением места для кучи, стека и т.д.?
Возможно всё...
Пошаговая отладка обычно раскрывает все тайны.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
skripach
сообщение May 31 2013, 06:59
Сообщение #6


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Код
     char* pText = "Main Menu";
     char* pString = strtok(pText, "\n");
     lcd_out(pString);

Не знаю как там ваши компилятор/линкер, но IAR строчку "Main Menu" положит во флеш и проц залетит в HardFault при выполнении. Строка в озу должна быть ибо strtok её меняет.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 31 2013, 07:15
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(skripach @ May 31 2013, 10:59) *
Не знаю как там ваши компилятор/линкер, но IAR строчку "Main Menu" положит во флеш и проц залетит в HardFault при выполнении.

C чего это?
По стандарту он должен разместить её в секции data а не rodata.
Если бы вы так написали:
Код
const char* pText = "Main Menu";

то шанс попасть во flash бы значительно выросsm.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
skripach
сообщение May 31 2013, 08:05
Сообщение #8


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
C чего это?

А с чего это ему ложить её во ОЗУ?
Если бы так:
Код
char pText[] = "Main Menu"

то да в озу.
Так как у стартера в озу будет только указатель на строку, сама же строка во флеши.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 31 2013, 08:11
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (skripach @ May 31 2013, 11:05) *
А с чего это ему ложить её во ОЗУ?
А с того, что от него требуется указатель на char *. Не на const char *, а на char *. Так что он должен был либо ругаться на невозможность присвоить адрес строки указателю (что противоречит стандарту), либо положить строку в ОЗУ.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 31 2013, 08:28
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(skripach @ May 31 2013, 12:05) *
А с чего это ему ложить её во ОЗУ? Если бы так:
Код
char pText[] = "Main Menu"

то да в озу. Так как у стартера в озу будет только указатель на строку, сама же строка во флеши.
Уууу, как всё запущеноsad.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
skripach
сообщение May 31 2013, 08:29
Сообщение #11


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
Уууу, как всё запущено sad.gif

Хм, проверил, IAR 6.50.1 ARM:

Код
int main(void)
{
  char* pText = "Main Menu1";
  char pText2[] = "Main Menu2";
  char* pString = strtok(pText2, " ");
  printf(pString);
  char* pString2 = strtok(pText, " ");
  printf(pString2);


"Main Menu1" - во шлеши.
"Main Menu2" - в озу.

после строки
Код
char* pString2 = strtok(pText, " ");
залёт в HardFault.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 31 2013, 08:39
Сообщение #12


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(skripach @ May 31 2013, 12:29) *
Хм, проверил, IAR 6.50.1 ARM:
IAR косячит. Пишите им репорт...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
lisstret
сообщение Jun 2 2013, 21:40
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 10-06-10
Из: Владивосток
Пользователь №: 57 835



Цитата
Не знаю как там ваши компилятор/линкер, но IAR строчку "Main Menu" положит во флеш и проц залетит в HardFault при выполнении. Строка в озу должна быть ибо strtok её меняет


Попробывал, действительно все заработало ( ) _ О Не думал что определение типа: char* pText = "Hello", кладет строку во флэш. Спасибо всем за ответы! Потестируюсь немного, если что-то опять пойдет не так, отпишусь)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 18:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016