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

double в параметрах функции передается как 0

7 hours ago, ashr said:

Если речь идет о кортексе... 

Стек на 8 выровняли?

даже не задумывался об этом. на мой взгляд это имеет какое то влияние на то видно или нет число в регистрах в момент входа в функцию, но на функционирования программы никак не должно сказываться. если только на времени выполнения.   и тогда встречный вопрос :  куда смотреть про используемое выравнивание?

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


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

4 minutes ago, firstvald said:

на мой взгляд это имеет какое то влияние на то видно или нет число в регистрах в момент входа в функцию, но на функционирования программы никак не должно сказываться

Это давно стало обязательным требованием ARM ABI. Невыполнение обычно и проявляется в виде неработающей double-арифметики.

 

7 minutes ago, firstvald said:

куда смотреть про используемое выравнивание?

Смотреть инициализацию стека(-ов).

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


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

4 часа назад, firstvald сказал:

куда смотреть про используемое выравнивание?

В первые 4 байта прошивки. Там записано начальное значение MSP.

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


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

Stack_Size		EQU     0x900

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size      EQU     0x600

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

увы ,  выравнивается.

 

заглядывал сюда

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


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

А в регистры-то заглянуть, раз отладчик подключен? Сразу снимутся вопросы с SP и параметрами.

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


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

уже нет под рукой. через регистры параметры в функцию не передавались. 

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


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

1 hour ago, firstvald said:

через регистры параметры в функцию не передавались. 

Другого пути нет в данном случае.

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


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

я посмотрел два варианта. с двумя передаваемыми параметрами и с 8мью. не а . не было в регистрах в первом случае чисел.

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


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

1 minute ago, firstvald said:

не было в регистрах в первом случае чисел.

В регистрах не может не быть чисел, так уж они устроены. Могут быть не те числа, если, например, прототип не соответствует функции. Два параметра типа double передаются в R0-R3.

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


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

в регистрах есть числа но не те. я посмотрю и скрины сделаю.

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


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

с double были проблеммы с выравниванием, места хранения параноидально сделал static и поставил на них прагма пак 8

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


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

6 часов назад, Картошка сказал:

double были проблеммы с выравниванием

Компилятор самостоятельно без внешних указаний знает правильное выравнивание для всех типов данных.

А проблемы с выравниваниванием в 99% случаев возникают при приведении указателей, в попытке вычитать число из потока данных  в виде массива байт по его смещению в нем.

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


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

3 часа назад, Darth Vader сказал:

Компилятор самостоятельно без внешних указаний знает правильное выравнивание для всех типов данных.

А проблемы с выравниваниванием в 99% случаев возникают при приведении указателей, в попытке вычитать число из потока данных  в виде массива байт по его смещению в нем.

Не факт, что из-за "приведений типа". Простейший пример: выделяем для задачи стек, невыровненный на границу 64бит; и все операции внутри такой задачи с double, размещёнными на стеке, идут лесом.

Другой пример: Проект на Cortex-M, по каким-то причинам (может остался по наследству от другого проекта) бит STKALIGN регистра CCR ядра = 0. В ISR используем double (на стеке). И опять - фиаско.  :vava: Хотя опять никаких "приведений указателей" и близко нет.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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