Перейти к содержанию
    

strtok не работает (STM32)

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

 

#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: Не разбираюсь в их названиях и т.д.)

- Платка stm32VlDiscovery

 

Просто не в первый раз уже так, пробываю воспользоваться какой-нить обычной функцией, например: strtok, printf и т.д. И в результате выкатывает одно и тоже. Если нужно что-то еще дописать, какие опции в проекте включены, ключи и т.д. я напишу. Я просто не знаю что еще указать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

но ошибка наверно не из-за этого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем воспользовался поиском по 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 , но результат такой же.

 

Подскажите, куда дальше то стоит копать? Возможно ли это, с неправильным выделением места для кучи, стека и т.д.?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, куда дальше то стоит копать? Возможно ли это, с неправильным выделением места для кучи, стека и т.д.?
Возможно всё...

Пошаговая отладка обычно раскрывает все тайны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

C чего это?

По стандарту он должен разместить её в секции data а не rodata.

Если бы вы так написали:

const char* pText = "Main Menu";

то шанс попасть во flash бы значительно вырос:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C чего это?

А с чего это ему ложить её во ОЗУ?

Если бы так:

char pText[] = "Main Menu"

то да в озу.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А с чего это ему ложить её во ОЗУ? Если бы так:

char pText[] = "Main Menu"

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

Уууу, как всё запущено:(

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уууу, как всё запущено :(

Хм, проверил, 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм, проверил, IAR 6.50.1 ARM:
IAR косячит. Пишите им репорт...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...