|
Lpc2000+RTOS+sprintf (Не работает sprintf), Как может операционка повлиять на sprintf ? |
|
|
|
Feb 6 2007, 10:12
|
Частый гость
 
Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905

|
Уважаемые сограждане подскажите пожалуйста, если кто знает  , почему после выхода из sprintf программа переходит на вектор сбоя данных DAbt_Handler. Так происходит только если я пытаюсь вывести в строку переменную float, если int то все нормально. Почему такое может быть? Процессор -LPC2103 Операционка - RTL- Keil Компилятор-RealView Структура программы следующая: Есть три задачи каждая из которых активизируется периодически при помощи конструкции: Код os_itv_set (5); for(;;) { os_itv_wait (); } это значит что каждая задача запускается каждые 50 млс (время для каждой задачи разное). sprintf выполняется только в одной из задач.
Сообщение отредактировал mihask - Feb 6 2007, 10:15
|
|
|
|
|
Feb 6 2007, 10:19
|
Частый гость
 
Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905

|
Цитата(Alex B._ @ Feb 6 2007, 13:15)  а стек задачи не переполняется случайно? Стек задачи со sprintf я выделил отдeльно от остальных задач Код static U32 stk2[256]; - т.е. 1024 байта, выделял и 2K Не помогает
Сообщение отредактировал mihask - Feb 6 2007, 10:20
|
|
|
|
|
Feb 6 2007, 12:07
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(mihask @ Feb 6 2007, 09:19)  Стек задачи со sprintf я выделил отдeльно от остальных задач Что значит "отдельно"? Точнее как "не отдельно" (если вытесняющие задачи) можно. Цитата Код static U32 stk2[256]; - т.е. 1024 байта, выделял и 2K Не помогает  Осталось убедиться, что размер памяти линкеру указан правильный ( 8K всего у 2103 ) соответствующий данному чипу, иначе "выделить" то можно. А при попытке воспользоваться  .....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 6 2007, 12:25
|
Частый гость
 
Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905

|
Цитата(zltigo @ Feb 6 2007, 15:07)  Цитата(mihask @ Feb 6 2007, 09:19)  Стек задачи со sprintf я выделил отдeльно от остальных задач
Что значит "отдельно"? Точнее как "не отдельно" (если вытесняющие задачи) можно. Цитата Код static U32 stk2[256]; - т.е. 1024 байта, выделял и 2K Не помогает  Осталось убедиться, что размер памяти линкеру указан правильный ( 8K всего у 2103 ) соответствующий данному чипу, иначе "выделить" то можно. А при попытке воспользоваться  ..... В Кейловской операционке стандартным способом (через конфигуратор ОС) можно выделить только одинаковый размер стека для каждой задачи. А через специальную функцию(при создании задачи) можно выделить стек другого размера для отдельной задачи. Размер памяти линкеру выделен правильный, потому что, если превышаем размер стека (при его настройке), то после перелинковки он матерится что 8К превышено. А вы использовали sprintf c float c какой нибудь осью ? Никаких там хитростей нет , кроме стека?
|
|
|
|
|
Feb 6 2007, 12:33
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(mihask @ Feb 6 2007, 11:25)  А вы использовали sprintf c float c какой нибудь осью ? Никаких там хитростей нет , кроме стека? Естественно использовал. Да какие там хитрости  - не хитрее memcpy(). Цитата В Кейловской операционке стандартным способом (через конфигуратор ОС) можно выделить Я бы назвал способ через какой-либо "конфигуратор" извращенным, а не стандарнтым
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 6 2007, 12:41
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(mihask @ Feb 6 2007, 12:12)  ...почему после выхода из sprintf ... если я пытаюсь вывести в строку переменную float...
Процессор -LPC2103 Операционка - RTL- Keil Компилятор-RealView А Вы уверены что в Вашей среде (компилятор/библиотеки/настройки) можно в хххprintf() передавать float вместо double?
|
|
|
|
|
Feb 6 2007, 13:11
|
Частый гость
 
Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905

|
Цитата(Alex03 @ Feb 6 2007, 15:41)  Цитата(mihask @ Feb 6 2007, 12:12)  ...почему после выхода из sprintf ... если я пытаюсь вывести в строку переменную float...
Процессор -LPC2103 Операционка - RTL- Keil Компилятор-RealView А Вы уверены что в Вашей среде (компилятор/библиотеки/настройки) можно в хххprintf() передавать float вместо double? Дело в том что если я отключаю одну(пустую) из трех задач, то float он у меня замечательно выводит. Цитата(zltigo @ Feb 6 2007, 15:33)  Цитата(mihask @ Feb 6 2007, 11:25)  В Кейловской операционке стандартным способом (через конфигуратор ОС) можно выделить
Я бы назвал способ через какой-либо "конфигуратор" извращенным, а не стандарнтым  Не там помоему все чисто  "конфигуратор" встроен в Keil, прицеплен к настраиваевому файлу и я тут же могу посмотреть какие константы изменились после моего вмешательства
|
|
|
|
|
Feb 6 2007, 13:23
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(zltigo @ Feb 6 2007, 15:01)  Тем не менее это не может являться причиной вылета. Зависит. 1. От реализации этого самого sprintf (точнее внутренностей типа vsprintf). Обработка нечисел и т.д. 2. От самой "форматной" строки (в которой, например '*’ потенциально опасна). Цитата(mihask @ Feb 6 2007, 15:11)  Цитата(Alex03 @ Feb 6 2007, 15:41)  А Вы уверены что в Вашей среде (компилятор/библиотеки/настройки) можно в хххprintf() передавать float вместо double? Дело в том что если я отключаю одну(пустую) из трех задач, то float он у меня замечательно выводит. Глюк он на то и глюк, очень часто проявляет себя при совсем левых действиях. Почитайте доку на вашу sprintf, и если там написано double, то надо обязательно передавать double! Ну или хоть попробуйте принудительно преобразовать в double.
|
|
|
|
|
Feb 6 2007, 13:32
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Т.е. еще уточнение. Сказанное относится к случаю если стеки задач определены статически как массивы. Но если использовать для стеков динамическое выделение памяти, то нужно внимательно изучить менеджер динамической памяти. Помочь может, например, менеджер блоков памяти фиксированной длины, который идет c uCOS. Цитата(AlexandrY @ Feb 6 2007, 14:53)  Хе..Хе, это грабли библиотеки RealView. Помогает только опция: --min_array_alignment=8 Иначе в библиотеки работы с float происходит непредусмотренное смещение стека, но не всегда, а только при определенном расположении стека. Поэтому легкая перекомпоновка кода может приводить к разному поведению sprintf. А операционка влияет на это тем образом, что стеки задач и соответственно переменные в них распологаются юзером не так как это сделал бы компилер знай он, что там будет распологаться float.
|
|
|
|
|
Feb 6 2007, 13:50
|
Частый гость
 
Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905

|
Цитата(AlexandrY @ Feb 6 2007, 16:23)  Хе..Хе, это грабли библиотеки RealView. Помогает только опция: --min_array_alignment=8 Иначе в библиотеки работы с float происходит непредусмотренное смещение стека, но не всегда, а только при определенном расположении стека. Поэтому легкая перекомпоновка кода может приводить к разному поведению sprintf. А операционка влияет на это тем образом, что стеки задач и соответственно переменные в них распологаются юзером не так как это сделал бы компилер знай он, что там будет распологаться float. Большое спасибо всем кто помогал , особено AlexandrY ! Похоже все дело в --min_array_alignment=8. Боюсь кричать ура  , но помоему ...  З А Р А Б О Т А Л А  . Щас попроверяю ишо. Если это обман зрения, буду плакать ишо 2AlexandrY А вы во многих проектах использовали RTOS+ RealView+sprintf+float?
Сообщение отредактировал mihask - Feb 6 2007, 13:52
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|