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

 
 
 
Reply to this topicStart new topic
> Форматированный вывод float в буфер sprintf, Yagartoo, LPC2144
Arischenko Ivan
сообщение Dec 16 2010, 05:35
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768



Добрый день.

определены переменные глобальные
static unsigned long sys_tick=13458;
float tmp=125.42;
char UartBuff1[100];

Хочу получить в буфер форматированный вывод
sprintf(&UartBuff1[0],"%d: %f \r \n ",(int )sys_tick,tmp);

Результаты в отладчике для буфера UartBuff1
"13458: 2.000000 \r \n ", '\000' <repeats 77 times>

Ткните носом, где почитать?
В приложении startup,Makefile,ld script ?
Прикрепленный файл  2144.rar ( 4.25 килобайт ) Кол-во скачиваний: 106
Go to the top of the page
 
+Quote Post
alx2
сообщение Dec 17 2010, 02:04
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Вероятно, к моменту вызова sprintf переменная tmp по каким-то причинам портится. Попробуйте
sprintf(&UartBuff1[0],"%d: %f \r \n ",(int )sys_tick,125.42f);
Если результат будет правильный, ищите, почему портится значение tmp. Если неправильный - видимо, проблема в библиотеке.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Arischenko Ivan
сообщение Dec 17 2010, 05:45
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768



Нет, с переменной все в порядке, предложенный вариант я пробовал.

Инициализация стека происходит в startup коде, указатель на стек программы инициализируемый последним и стек должен расти "вниз".

CODE

/* Enter Supervisor Mode and set its Stack Pointer */
msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */
mov sp, r0
sub r0, r0, #SVC_STACK_SIZE

/* Enter System Mode and set its Stack Pointer */
msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* User Mode */
mov sp, r0


В скрипте линкера есть код, который позволяет получить конец программы в SRAM, для динамического выделения памяти в heap
CODE

.bss : /* collect all uninitialized .bss sections that go into RAM */
{
_bss_start = .; /* define a global symbol marking the start of the .bss section */
*(.bss) /* all .bss sections */
} >ram /* put all the above in RAM (it will be cleared in the startup code */
. = ALIGN(4); /* advance location counter to the next 32-bit boundary */
_bss_end = . ; /* define a global symbol marking the end of the .bss section */
. = ALIGN(4);
.eh_frame :
{
KEEP (*(.eh_frame))
} > ram
}
_end = .; /* define a global symbol marking the end of application RAM */
PROVIDE (end = .);


PROVIDE (end = .) используется в void * _sbrk_r при выделении памяти :

CODE

void * _sbrk_r(
struct _reent *_s_r,
ptrdiff_t nbytes)
{
char *base; /* errno should be set to ENOMEM on error */

if (!heap_ptr) { /* Initialize if first time through. */
heap_ptr = end;
}
base = heap_ptr; /* Point to end of heap. */
heap_ptr += nbytes; /* Increase heap. */

return base; /* Return pointer to start of new heap area. */
}


Вроде все честно : стек растет с верха памяти вниз, heap начинается с конца программы и растет вверх, т.е. память не должна портиться и все должно работать. Но при использовании sprintf прошка работает через раз, такое ощущение что каким-то образом затирается стек. В общем я каком-то тупике, осталось попробовать другой toolchain.

В общем заработало, осталось самому себе объяснить полученные результаты :

При увеличении стека
.set SVC_STACK_SIZE, 0x00001000 /* stack for "SVC" supervisor mode is 4 bytes */

Форматированный вывод заработал нормально.
Go to the top of the page
 
+Quote Post

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

 


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


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