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

Настраиваю 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

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


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

4 минуты назад, inventor сказал:

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

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

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


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

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;

 

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


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

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

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

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

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


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

3 minutes ago, andrew_su said:

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

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

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

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

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

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

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


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

Возможно у Вас 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 раз уже об этом говорилось.....

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


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

#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;

то все ОК

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

 

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


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

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 не виноват...

Изменено пользователем GenaSPB

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


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

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

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

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

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

то все ОК

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

 

 

Разобрался

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

2 minutes ago, GenaSPB said:

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

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

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

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


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

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

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

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

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

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


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

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.

 

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


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

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

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

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

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

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


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

6 minutes ago, AVI-crak said:

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

 

14 minutes ago, AVI-crak said:

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

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

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


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

4 hours ago, aaarrr said:

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

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

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


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

17 minutes ago, AVI-crak said:

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

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

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


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

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

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

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

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

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

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

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

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

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