Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 07.03.2017, 13:25  
MikhailSh
Временная регистрация
 
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
MikhailSh на пути к лучшему
По умолчанию Запутался с 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;
Реклама:
MikhailSh вне форума  
Непрочитано 07.03.2017, 13:46  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию Re: Запутался с volatile...

А зачем такая параноя с volatile ? И странные структуры для таймеров,ведь все есть в регистрах.
__________________
Глаза боятся,а руки делают.
CERGEI1982 вне форума  
Непрочитано 07.03.2017, 14:28  
MikhailSh
Временная регистрация
 
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
MikhailSh на пути к лучшему
По умолчанию Re: Запутался с volatile...

Это програмные таймера обрабатываемые в прерывании от аппаратного таймера. Их несколько видов с разным количеством и единичным временем. А функция обработки одна. Для функции нужно знать количество таймеров каждого вида определенные в #define NUM1 5, #define NUM2 3, #define NUM3 10, и являющиеся размером массива TIM1[NUM1], TIM2[NUM2], TIM3[NUM3]. Я не хотел в функцию обработки передавать количество таймеров и так параметров хватает. Решил сделать через указатель.
MikhailSh вне форума  
Непрочитано 07.03.2017, 17:58  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Запутался с volatile...

Хе. Вы наверно перепутали volatile с #define, судя по характеру написания.
Ибо volatile - это всего лишь рекомендация компилятору не оптимизировать работу с переменными, когда включается какой-либо уровень оптимизации. И тогда уже правильнее писать volatile перед каждым типом переменных, включенных в структуру
NewWriter вне форума  
Непрочитано 07.03.2017, 18:16  
dgrishin
Почётный гражданин KAZUS.RU
 
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: Запутался с volatile...

Сообщение от MikhailSh Посмотреть сообщение
Вопрос разве volatile на структуру не передается на все ее переменные?
Могу предположить что объекты типа массивов, структур и проч. неявно представляются в виде ссылок, которые автоматически разыменуются при обращении к ним (и тип volatile относится к ссылке на объект а не к его содержимому)
Например
volatile T_TIM TIM_Tim[5] - TIM_Tim это неявная ссылка с типом volatile.
Если её явно привести к типу ссылки - &TIM_Tim[1] то тип volatile не потерялся (т. к. компилятор ругается на "volatile T_TIM *" cannot be assigned..." - это как раз про неё.
dgrishin вне форума  
Непрочитано 07.03.2017, 18:29  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" NewWriter
MikhailSh (09.03.2017)
Непрочитано 07.03.2017, 18:35  
dgrishin
Почётный гражданин KAZUS.RU
 
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: Запутался с volatile...

Сообщение от NewWriter Посмотреть сообщение
Как я понял, товарисчь желает создать переменную в виде структуры, содержащую набор неких переменных какого-то счетчика, режима работы, состояния.
RTOS + Virtual Timer помогают не изобретать велосипед.
dgrishin вне форума  
Непрочитано 07.03.2017, 18:40  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию 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.
NewWriter вне форума  
Непрочитано 07.03.2017, 18:53  
dgrishin
Почётный гражданин KAZUS.RU
 
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: Запутался с volatile...

Сообщение от NewWriter Посмотреть сообщение
Пфффффф... А чо, безо РТОС ужо и структуру напесать немогём??? Ну ёлыпалы а...
А представим себе, что там не таймеры вовсе, а че-нить вообще отвлеченное, типа списка какой-нить хрени.. И какими РТОСами тогда рулить?
Тогда виртуальные таймеры при наступления разных временных событий отправляют сообщения соотв. Thread ам где и происходит необходимая обработка событий - по моему абстрактней некуда
dgrishin вне форума  
Непрочитано 07.03.2017, 18:57  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Запутался с volatile...

Я не про таймеры писал, а вообще. Мало ли что может быть в структуре. Может, там список чисел, никак не связанных с какими-либо таймерами.
Неужто самостоятельно без шаблона в РТОС ужо и свою структуру записать то не могёте?

Сообщение от dgrishin Посмотреть сообщение
ссылка с типом volatile.
volatile - это НЕ ТИП переменной! Это - СПЕЦИФИКАТОР переменной, задающий поведение переменной при компиляции. Подобно спецификатору static.
Кстати, запись volatile для всей переменной типа структуры тоже работает, но нужно во-первых, правильно ее использовать, во-вторых, понять, а нужно ли оно вообще?

Последний раз редактировалось NewWriter; 07.03.2017 в 19:20.
NewWriter вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Амперметр на МК whoim Электроника - это просто 239 07.08.2017 09:12
Keil C51 и volatile. Массив, изменяемый в обработчике прерывания - volatile? ArtemKolesnikov Микроконтроллеры, АЦП, память и т.д 3 07.01.2017 23:14
volatile unsigned char bass1981 Песочница (вопросы новичков) 2 12.03.2014 00:30
Когда нужно volatile? neox-neox Микроконтроллеры, АЦП, память и т.д 18 23.08.2011 12:40
Копировщик ЕЕПРОМ russo_turisto Микроконтроллеры, АЦП, память и т.д 14 04.06.2011 12:30


Часовой пояс GMT +4, время: 16:04.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot