Jump to content

    
Sign in to follow this  
inventor

Глюки IAR или у меня?

Recommended Posts

Настраиваю RTC и вхожу дебагером внутрь функции RTC_EnterInitMode()

Функция должна вернуть статус ERROR или SUCCESS (описано как !ERROR)

Прохожу все строки и вижу что status = SUCCESS не присваивается,

функция возвращает ошибку.

ErrorStatus RTC_EnterInitMode(void)
{
    __IO uint32_t initcounter = 0x00;
    ErrorStatus status = ERROR;
    uint32_t initstatus = 0x00;
    

    /* Check if the Initialization mode is set */
    if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t) RESET) {
    /* Set the Initialization mode */
    RTC->ISR = (uint32_t) RTC_INIT_MASK;

    /* Wait till RTC is in INIT state and if Time out is reached exit */
    do {
        initstatus = RTC->ISR & RTC_ISR_INITF;
        initcounter++;
    } while ((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00));
        
                
    if ((RTC->ISR & RTC_ISR_INITF) != RESET) {
        status = SUCCESS;
            return 1;
    } else {
        status = ERROR;
    }
    } else {
    status = SUCCESS;
        return 1;
    }
    return (status);
}

Поставл возврат единицы - заработало

В чем может быть проблема?

Результат status лежит в регистре R0

Share this post


Link to post
Share on other sites
4 минуты назад, inventor сказал:

Функция должна вернуть статус ERROR или SUCCESS (описано как !ERROR)

Видимо: как объявлены эти ERROR, SUCCESS, ErrorStatus и пр. - предлагаете угадать отвечающим?

Share this post


Link to post
Share on other sites
2 minutes ago, jcxz said:

Видимо: как объявлены эти ERROR, SUCCESS, ErrorStatus и пр. - предлагаете угадать отвечающим?

в стандартном библиотечном файле

typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;

typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))

typedef enum {ERROR = 0, SUCCESS =  !ERROR} ErrorStatus;

 

Share this post


Link to post
Share on other sites
if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t) RESET) 

А почему в этом условии есть (uint32_t), а в следующем if просто != RESET?

И еще, по какому из return 1 происходит выход?

Share this post


Link to post
Share on other sites
3 minutes ago, andrew_su said:

if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t) RESET) 

А почему в этом условии есть (uint32_t), а в следующем if просто != RESET?

И еще, по какому из return 1 происходит выход?

по самому первому

бит правильно выставляется и проверяется

но почему то возвращает ноль.

Share this post


Link to post
Share on other sites

Возможно у Вас RTC объявлен неправильно - без volatile. Поэтому выполнив:

if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t) RESET) {

RTC->ISR = (uint32_t) RTC_INIT_MASK;

далее по этой ветке он везде считает (RTC->ISR & RTC_ISR_INITF) == (uint32_t) RESET, а значит будет считать

if ((RTC->ISR & RTC_ISR_INITF) != RESET) {

всегда ложным.

 

PS: А вообще в таких случаях следует смотреть ассемблерный листинг, а не гадать на кофейной гуще. 100500 раз уже об этом говорилось.....

Share this post


Link to post
Share on other sites

#define RTC                 ((RTC_TypeDef *) RTC_BASE)

вот так объявлено

RTC_TypeDef как я понимаю структура с описанием регистров

Внутри все регистры объявлены как _IO - 

typedef __IO int32_t  vs32;

то есть volatile

24 minutes ago, jcxz said:

алее по этой ветке он везде считает (RTC->ISR & RTC_ISR_INITF) == (uint32_t) RESET, а значит будет считать

дебагером он попадет вот сюда:

if ((RTC->ISR & RTC_ISR_INITF) != RESET) {
        status = SUCCESS;
 

и статус не переприсваивается

посмотрел ассемблер

кажись нашел причину.

Присваивание status = SUCCESS; не работает

если пишешь status = 1;

то все ОК

почему он так воспринимает - загадка

 

Share this post


Link to post
Share on other sites
1 hour ago, inventor said:

в стандартном библиотечном файле


typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;

typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))

typedef enum {ERROR = 0, SUCCESS =  !ERROR} ErrorStatus;

 

А как вам такое решение партии и правительства?:
image.thumb.png.888fcec9547335c12f52bcde22a4ffae.png

Не присваивать может потому, что значение совпало с тем, на какое инициализировали при входе в функцию.
А кото там потом сравнивает результат не с enum значениями, а с константой - iar не виноват...

Edited by GenaSPB

Share this post


Link to post
Share on other sites

посмотрел ассемблер

кажись нашел причину.

Присваивание status = SUCCESS; не работает

если пишешь status = 1;

то все ОК

почему он так воспринимает - загадка

 

 

Разобрался

в моем файле переопределение SUCCESS 

2 minutes ago, GenaSPB said:

А как вам такое решение партии и правительства?:
image.thumb.png.888fcec9547335c12f52bcde22a4ffae.png

Охрененно! Чего уж сказать!

меняю на bool свои функции

Share this post


Link to post
Share on other sites

Ну классика-же:

#undef true
#define true false
/* ебитесь как хотите */

Кстати, значение bool не обязательно должно возвращаться в регистре R0. Вместо этого используется регистр xpsr(для arm), в котором находятся биты сравнения: всё что не равно - лож.

По этой причине использование bool на чипах cortex M0 - добавляет очень странные телодвижения, которые трудно понимать на трезвую голову.

Share this post


Link to post
Share on other sites
10 minutes ago, AVI-crak said:

Кстати, значение bool не обязательно должно возвращаться в регистре R0. Вместо этого используется регистр xpsr(для arm)

Кем используется? AAPCS такого не предусматривает совсем:

Quote

The CPSR is a global register with the following properties:

• The N, Z, C, V and Q bits (bits 27-31) and the GE[3:0] bits (bits 16-19) are undefined on entry to or return from a public interface. The Q and GE[3:0] bits may only be modified when executing on a processor where these features are present.

 

Share this post


Link to post
Share on other sites

Ой-ли... https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/builtin-types/bool

Bool сам себе результат применения логики, он не является числовым значением. И есно к регистрам r0-r3 имеет очень слабое отношение - переходит в число исключительно в режиме эмуляции самого себя. Так-же значение bool нельзя передать куда-то далеко, можно только использовать здесь и сейчас.

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

Это нормально до момента, пока библиотека не меняет тип ядра, например с cortex M7 на cortex M0 и обратно. А меняют ядро для того чтобы библиотека работала везде и всегда. Вот только bool после таких манипуляций намертво переходит в режим эмуляции. Это кстати одна из тех причин, по которой я ненавижу чужие откомпелированные библиотеки.

Share this post


Link to post
Share on other sites
6 minutes ago, AVI-crak said:

Это к чему вообще?

 

14 minutes ago, AVI-crak said:

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

Внутри может быть что угодно, но во внешний мир bool флагами не передается.

Share this post


Link to post
Share on other sites
4 hours ago, aaarrr said:

Внутри может быть что угодно

Не путать именную структуру с полем bool(числовое значение+реальный адрес), и bool в качестве возврата функции - одно определение вообще на весь проект. Как только значению bool даётся новое имя - сразу появляется адрес для хранения числового значения, который уже можно передавать куда угодно. Но в чистом виде GCC имеет право заоптимизировать вусмерть, лишив физического адреса. Как оно первоначально и было задумано.

Share this post


Link to post
Share on other sites
17 minutes ago, AVI-crak said:

Но в чистом виде GCC имеет право заоптимизировать вусмерть, лишив физического адреса. Как оно первоначально и было задумано.

Положим, имеет. Штука в том, чтобы воспользоваться таким правом. В жизни наблюдали? Любопытно было бы взглянуть.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this