07.03.2017, 13:25
|
|
Временная регистрация
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Запутался с volatile...
Есть код:
Код:
|
#include "stm32f10x.h"
#include "stdint.h"
uint8_t temp_data;
typedef struct
{
unsigned int Count;
unsigned int Preset;
unsigned char Mode;
unsigned char Status;
} T_TIM;
typedef struct
{
unsigned char NumTim;
T_TIM * ptrTim;
} T_TIM_GROUP;
volatile T_TIM_GROUP TIM_TimGroup;
volatile T_TIM TIM_Tim[5];
int main(void)
{
TIM_TimGroup.ptrTim = &TIM_Tim[1]; //
temp_data = TIM_TimGroup.ptrTim-›Status; //
} |
TIM_TimGroup используется в прерывании по таймеру как параметр функции TIM_Work(volatile T_TIM_GROUP *TIM_GroupTimers). Что бы было понятно: для функции нужен указатель т. к. используется несколько групп с разным числом NumTim.
При компиляции выдается сообщение:
Main\main.c(2 : warning: #513-D: a value of type "volatile T_TIM *" cannot be assigned to an entity of type "T_TIM *"
Если сделать так
Код:
|
typedef struct
{
unsigned char NumTim;
volatile T_TIM * ptrTim;
} T_TIM_GROUP; |
или
Код:
|
typedef struct
{
unsigned char NumTim;
volatile T_TIM * volatile ptrTim;
} T_TIM_GROUP; ; |
Сообщения нет.
Вопрос разве volatile на структуру не передается на все ее переменные?
Ответ нашел вот здесь http://chipenable.ru/index.php/item/60 но несовсем понятно.
И как правильно: volatile T_TIM * ptrTim; или volatile T_TIM * volatile ptrTim;
|
|
|
|
07.03.2017, 13:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Запутался с volatile...
А зачем такая параноя с volatile ? И странные структуры для таймеров,ведь все есть в регистрах.
__________________
Глаза боятся,а руки делают.
|
|
|
|
07.03.2017, 14:28
|
|
Временная регистрация
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Запутался с volatile...
Это програмные таймера обрабатываемые в прерывании от аппаратного таймера. Их несколько видов с разным количеством и единичным временем. А функция обработки одна. Для функции нужно знать количество таймеров каждого вида определенные в #define NUM1 5, #define NUM2 3, #define NUM3 10, и являющиеся размером массива TIM1[NUM1], TIM2[NUM2], TIM3[NUM3]. Я не хотел в функцию обработки передавать количество таймеров и так параметров хватает. Решил сделать через указатель.
|
|
|
|
07.03.2017, 17:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Запутался с volatile...
Хе. Вы наверно перепутали volatile с #define, судя по характеру написания.
Ибо volatile - это всего лишь рекомендация компилятору не оптимизировать работу с переменными, когда включается какой-либо уровень оптимизации. И тогда уже правильнее писать volatile перед каждым типом переменных, включенных в структуру
|
|
|
|
07.03.2017, 18:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Запутался с volatile...
Сообщение от MikhailSh
|
Вопрос разве volatile на структуру не передается на все ее переменные?
|
Могу предположить что объекты типа массивов, структур и проч. неявно представляются в виде ссылок, которые автоматически разыменуются при обращении к ним (и тип volatile относится к ссылке на объект а не к его содержимому)
Например
volatile T_TIM TIM_Tim[5] - TIM_Tim это неявная ссылка с типом volatile.
Если её явно привести к типу ссылки - &TIM_Tim[1] то тип volatile не потерялся (т. к. компилятор ругается на "volatile T_TIM *" cannot be assigned..." - это как раз про неё.
|
|
|
|
07.03.2017, 18:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Запутался с volatile...
Как я понял, товарисчь желает создать переменную в виде структуры, содержащую набор неких переменных какого-то счетчика, режима работы, состояния.
Тогда так и пишем:
PHP код:
|
typedef struct {
volatile uint32_t count; // 32-разр. счетчик
volatile uint8_t preset :3; // 3 бита под пресеты
volatile uint8_t mode :2; // 2 бита под режимы
volatile uint8_t status :1; // 1 бит под статус
}timer_t;
#define TIM_DONE 1
timer_t whattafakatimer; //объявл. переменная whattafakatimer с типом структуры timer_t
whattafakatimer.preset = 2; // выбран пресет 2 таймера
whattafakatimer.count = 244576; // начальное значение таймера
while(whattafakatimer.count) // пока счет не равен 0,
{
whattafakatimer.count--; // декремент счетчика
}
whattafakatimer.status = TIM_DONE; // бит статуса = 1, "выболнено"
|
typedef struct - это всего лишь создается ТИП в виде структуры. То есть, любая переменная, для которой задан тип timer_t (или в авторском случае - T_TIM) будет состоять из структуры вон тех четырех переменных.
Но у топикстартера используется более сложная замута с вложенной структурой, причем в виде ссылки.
Кароч, хотите volatile - объявляйте каждую переменную в структурах как volatile.
Последний раз редактировалось NewWriter; 07.03.2017 в 18:37.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
07.03.2017, 18:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Запутался с volatile...
Сообщение от NewWriter
|
Как я понял, товарисчь желает создать переменную в виде структуры, содержащую набор неких переменных какого-то счетчика, режима работы, состояния.
|
RTOS + Virtual Timer помогают не изобретать велосипед.
|
|
|
|
07.03.2017, 18:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Запутался с volatile...
Пфффффф... А чо, безо РТОС ужо и структуру напесать немогём??? Ну ёлыпалы а...
А представим себе, что там не таймеры вовсе, а че-нить вообще отвлеченное, типа списка какой-нить хрени.. И какими РТОСами тогда рулить?
Ведь вначале надо определиться - на кой фик вообще эта volatile ставится и че она делает.
Есть две крайности - не использовать volatile вообще, и тогда при включении оптимизации в некоторых случаях полезут косяки в виде выбрасывания операций с переменными. И вторая крайность - пихать volatile везде, и тогда включение даже максимального уровня оптимизации ничего не оптимизирует, не ускорит и не уменьшит размеров кода.
Простой пример:
for (int i = 0; i‹10; i++)
{
__NOP();
}
когда i объявлена просто как int, то включение оптимизации выбросит переменную i и вставит 10 NOP-ов.
Если же написать volatile int i, то будет вставлен один NOP и инкремент i с проверкой достижения знач.10. То есть так же, как и с выключенной оптимизацией.
Последний раз редактировалось NewWriter; 07.03.2017 в 18:54.
|
|
|
|
07.03.2017, 18:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Запутался с volatile...
Сообщение от NewWriter
|
Пфффффф... А чо, безо РТОС ужо и структуру напесать немогём??? Ну ёлыпалы а...
А представим себе, что там не таймеры вовсе, а че-нить вообще отвлеченное, типа списка какой-нить хрени.. И какими РТОСами тогда рулить?
|
Тогда виртуальные таймеры при наступления разных временных событий отправляют сообщения соотв. Thread ам где и происходит необходимая обработка событий - по моему абстрактней некуда
|
|
|
|
07.03.2017, 18:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Запутался с volatile...
Я не про таймеры писал, а вообще. Мало ли что может быть в структуре. Может, там список чисел, никак не связанных с какими-либо таймерами.
Неужто самостоятельно без шаблона в РТОС ужо и свою структуру записать то не могёте?
Сообщение от dgrishin
|
ссылка с типом volatile.
|
volatile - это НЕ ТИП переменной! Это - СПЕЦИФИКАТОР переменной, задающий поведение переменной при компиляции. Подобно спецификатору static.
Кстати, запись volatile для всей переменной типа структуры тоже работает, но нужно во-первых, правильно ее использовать, во-вторых, понять, а нужно ли оно вообще?
Последний раз редактировалось NewWriter; 07.03.2017 в 19:20.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:04.
|
|