реклама на сайте
подробности

 
 
> STM3210X_LD_VL, табличная инициализация периферии
_Pasha
сообщение Jan 26 2013, 11:15
Сообщение #1


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Привет.
Озадачился сабжем на мелкие армы.
От простого к сложному, сделал такую штуку.
Прикрепленный файл  batch_conf.zip ( 1.52 килобайт ) Кол-во скачиваний: 71

Обновляю здесь, пока есть возможность редактировать.
пример использования
CODE

#include "batch_conf.h"
batch_BEGIN(main_tbl)
batch_OR(&(RCC->CR),RCC_CR_HSEON)
batch_WAIT(&(RCC->CR), RCC_CR_HSERDY)
batch_WRITE(&(RCC->CFGR),RCC_CFGR_PLLMULL_0 |RCC_CFGR_PLLSRC)
batch_OR(&(RCC->CR), RCC_CR_PLLON)
batch_WAIT(&(RCC->CR), RCC_CR_PLLRDY)
batch_OR(&(RCC->CFGR),2)
batch_END;

batch_conf(main_tbl, NULL);



Создается таблица во флеше.
Элемент - структура {uint32_t port, data;} Названия полей многоцелевые, поэтому чисто условные, можно unionom разделить для ясности
В тетраду бит 24-27 поля port встроена команда
Конфигуратор выполняет эти команды

Функция заняла 316 байт в кейле.
фрагмент, соответствующий примеру
CODE
RCC->CR |= RCC_CR_HSEON;
while(!(RCC->CR & RCC_CR_HSERDY));
RCC->CFGR = RCC_CFGR_PLLMULL_0 |RCC_CFGR_PLLSRC ;
RCC->CR |= RCC_CR_PLLON;
while(!(RCC->CR & RCC_CR_PLLRDY));
RCC->CFGR |= 2;


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

Сообщение отредактировал _Pasha - Jan 26 2013, 16:27
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Tahoe
сообщение Jan 26 2013, 12:51
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(_Pasha @ Jan 26 2013, 15:15) *
Создается таблица во флеше.

1. Насколько я понимаю, сразу после того, как адреса периферии будут помещены в таблицу, они перестанут быть volatile. С потенциально возможными приколами и последствиями.
2. А как потом сопровождать эту помойку?
3. И главное. Как писать драйвера, с учетом этого "веяния"? Т.е. вместо DEV_X_DRV.h, где вызывается инициализация, например, пинов, все поубивать? А как быть, если пин расшарен и требует в разные моменты разной инициализации/конфигурации?

"Не экономь память. Память, это г*вно. Производительность!" (с) Один умный человек, еще лет 10-12 назад сказал мне.


P.S.
А если попадётся вот такой, тяжелый случай, когда производитель свинью подложил, вместо SPI, снова менять концепцию инициализации периферии?

CODE
////////////////////////////////////////////////////////////////////////////////
// TRF7960_X_drv.h //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#ifndef TRF7960_X_DRV_H
#define TRF7960_X_DRV_H

////////////////////////////////////////////////////////////////////////////////
#include <bsp.h>

////////////////////////////////////////////////////////////////////////////////
typedef BSP_U08 TRF796x_U08;
typedef BSP_U16 TRF796x_U16;
typedef BSP_U32 TRF796x_U32;
typedef BSP_BOOL TRF796x_BOOL;
typedef BSP_U08 TRF796x_DATA;

////////////////////////////////////////////////////////////////////////////////
#define TRF796x_X_Init() BspTrf796x_Init()
#define TRF796x_X_Enable() BspTrf796x_Enable()
#define TRF796x_X_Disable() BspTrf796x_Disable()
#define TRF796x_X_IrqEnable() BspTrf796x_InterruptEnable()
#define TRF796x_X_IrqDisable() BspTrf796x_InterruptDisable()
#define TRF796x_X_TimerConfig( U08 ) BspTrf796x_TimerConfig( U08 )
#define TRF796x_X_TimerStart() BspTrf796x_TimerStart()
#define TRF796x_X_TimerStop() BspTrf796x_TimerStop()
#define TRF796x_X_Delay_mSec( U32 ) BspDelay_mSec( U32 )

#define TRF796x_DUMMY 0x00

////////////////////////////////////////////////////////////////////////////////
#pragma inline
void TRF796x_X_Command( const TRF796x_U08 Command )
{
// SLOA155 - TRF7960A Firmware Design Hints
// 7.7 SPI With SS Pin Only – Single-Byte Direct Commands
// Description
// All single byte direct commands need an additional CLK cycle to work.
// Workaround
// All direct command functions need to have an additional DATA_CLK cycle
// before Slave Select l line goes high.

BspSpiOpen();
BspSpiXfer08_Mode00( Command );
BspSpiXfer08_Mode00( TRF796x_DUMMY );
BspSpiClose();
}

////////////////////////////////////////////////////////////////////////////////
#pragma inline
TRF796x_U08 TRF796x_X_Read( const TRF796x_U08 Addr )
{
TRF796x_U08 Data;

////////////////////////////////////////////////////////////////////////////
BspSpiOpen();
BspSpiXfer08_Mode00( Addr );
Data = BspSpiXfer08_Mode01( TRF796x_DUMMY );
BspSpiClose();

return( Data );
}

////////////////////////////////////////////////////////////////////////////////
#pragma inline
void TRF796x_X_ReadBurst( const TRF796x_U08 Addr,
TRF796x_U08 * pData,
TRF796x_U08 Count )
{
BspSpiOpen();
BspSpiXfer08_Mode00( Addr );
while( Count-- )
{
*pData++ = BspSpiXfer08_Mode01( TRF796x_DUMMY );
}
BspSpiClose();
}

////////////////////////////////////////////////////////////////////////////////
#pragma inline
void TRF796x_X_Write( const TRF796x_U08 Addr,
const TRF796x_U08 Data )
{
////////////////////////////////////////////////////////////////////////////
BspSpiOpen();
BspSpiXfer08_Mode00( Addr );
BspSpiXfer08_Mode00( Data );
BspSpiClose();
}

////////////////////////////////////////////////////////////////////////////////
#pragma inline
void TRF796x_X_WriteBurst( const TRF796x_U08 Addr,
TRF796x_U08 * pData,
TRF796x_U08 Count )
{
// SLOA155 - TRF7960A Firmware Design Hints
// 7.2 SPI With SS Pin Only – Direct Commands
// Description
// Serial interface with SS pin only, the direct commands are not executed
// if they are the last operation in the SPI communication. In the SPI interface
// with SS pin the Stop condition clock pulse is missing (compared to
// the parallel interface and SPI without SS pin). Some operations are relying
// on this clock and they do not work as expected.
// Workaround
// If a direct command is the last operation in the SPI communication,
// the SS pin goes high. Afterward, an additional clock pulse has to be sent.

BspSpiOpen();
BspSpiXfer08_Mode00( Addr );
while( Count-- )
{
BspSpiXfer08_Mode00( *pData++ );
}
BspSpiClose();
BspSpiXfer08_Mode00( TRF796x_DUMMY );
}

#endif //TRF7960_X_DRV_H

В данном случае, проблема вот в этом:
Цитата
7.1 SPI With SS Pin Only – No High Impedance

Description
Serial interface with SS pin only, the interface does not go to high impedance when SS is high. It is not
possible to multiplex the serial port interface lines.

Workaround
An external three-state buffer must be used if the chip is connected to a serial bus and the interface lines
are multiplexed.

И что будем делать? Сэкономим пару байт на инициализации и повесим снаружи железо, как они "советуют"?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 26 2013, 13:32
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Tahoe @ Jan 26 2013, 16:51) *
1. Насколько я понимаю, сразу после того, как адреса периферии будут помещены в таблицу, они перестанут быть volatile. С потенциально возможными приколами и последствиями.

Спасибо. Дельное замечание. Поправлю.
Цитата
...
И что будем делать? Сэкономим пару байт на инициализации

Вы в ответ на частное решение начали сыпать частностями, но из другой области sm.gif Да у Вас в самый худенький F100 не больше двух вменяемых драйверов влезет sm.gif а еще и что-то делать нужно. Более того, еще со времен ассемблера всегда старался таблично железо настраивать.
Да и какая сложность, обернете batch_conf() с местно заданной табличкой в xxxx_Init() ? Единственный критерий - либо память либо скорость, хоть что-то должно быть на высоте. В общем, сущность уже есть, кривая она или не очень - каждый решает сам.

Сообщение отредактировал _Pasha - Jan 26 2013, 13:33
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Pasha   STM3210X_LD_VL   Jan 26 2013, 11:15
|- - scifi   Цитата(Tahoe @ Jan 26 2013, 16:51) ...   Jan 26 2013, 17:27
- - HHIMERA   Цитата(_Pasha @ Jan 26 2013, 15:15) От пр...   Jan 26 2013, 13:03
- - ReAl   Подобным образом (парами адрес-данные в собираемой...   Jan 26 2013, 14:01
|- - _Pasha   Цитата(ReAl @ Jan 26 2013, 18:01) (чего н...   Jan 26 2013, 14:12
|- - ReAl   Цитата(_Pasha @ Jan 26 2013, 16:12) А ест...   Jan 26 2013, 14:20
|- - _Pasha   Цитата(ReAl @ Jan 26 2013, 18:20) Зато им...   Jan 26 2013, 14:45
|- - AHTOXA   Цитата(_Pasha @ Jan 26 2013, 20:45) За чт...   Jan 26 2013, 14:53
|- - _Pasha   Цитата(AHTOXA @ Jan 26 2013, 17:53) То ес...   Jan 26 2013, 16:11
- - Golikov A.   Народ а можно в 2 словах в чем бизнес то? За что б...   Jan 26 2013, 14:13
|- - _Pasha   Цитата(Golikov A. @ Jan 26 2013, 18:13) Н...   Jan 26 2013, 14:17
- - Golikov A.   что то я видать отстал от технологий... я вообще ...   Jan 26 2013, 14:35
- - Golikov A.   не я правда что-то не втыкаю почему batch_OR(...   Jan 26 2013, 14:58
- - _Pasha   Цитата(AHTOXA @ Jan 26 2013, 18:53) +1:) ...   Jan 26 2013, 15:26
- - Golikov A.   чет я все равно не понимаю... это для систем в к...   Jan 26 2013, 15:32
|- - kolobok0   Цитата(Golikov A. @ Jan 26 2013, 19:32) ....   Jan 26 2013, 17:12
|- - Golikov A.   Цитата(kolobok0 @ Jan 26 2013, 21:12) про...   Jan 26 2013, 18:25
|- - AHTOXA   Цитата(Golikov A. @ Jan 27 2013, 00:25) Т...   Jan 26 2013, 18:52
||- - HHIMERA   Цитата(AHTOXA @ Jan 26 2013, 21:52) Плюс ...   Jan 26 2013, 19:07
||- - Golikov A.   Цитата(AHTOXA @ Jan 26 2013, 22:52) Автор...   Jan 26 2013, 19:26
||- - AHTOXA   Цитата(Golikov A. @ Jan 27 2013, 01:26) Т...   Jan 26 2013, 19:39
||- - Golikov A.   Цитата(AHTOXA @ Jan 26 2013, 23:39) На ST...   Jan 26 2013, 20:14
||- - ReAl   Цитата(Golikov A. @ Jan 26 2013, 22:14) а...   Jan 26 2013, 20:37
||- - Golikov A.   Цитата(ReAl @ Jan 27 2013, 00:37) А у CM0...   Jan 26 2013, 20:41
||- - AHTOXA   Цитата(ReAl @ Jan 27 2013, 02:37) И ещё к...   Jan 26 2013, 20:43
||- - _Pasha   Цитата(ReAl @ Jan 27 2013, 00:37) Надо ум...   Jan 26 2013, 20:45
|- - _Pasha   Цитата(Golikov A. @ Jan 26 2013, 22:25) Т...   Jan 26 2013, 20:16
- - AHTOXA   Цитата(Golikov A. @ Jan 27 2013, 02:14) а...   Jan 26 2013, 20:23
|- - _Pasha   Цитата(AHTOXA @ Jan 27 2013, 00:23) Ну во...   Jan 26 2013, 20:41
- - Golikov A.   кажется начинаю понимать... а сколько операций ух...   Jan 26 2013, 20:38
- - Golikov A.   Хоть плачь... стандартный вариант в регистр запи...   Jan 26 2013, 20:55
|- - AHTOXA   Цитата(Golikov A. @ Jan 27 2013, 02:55) ч...   Jan 26 2013, 20:58
- - Golikov A.   код команды грузить же все равно надо? данные груз...   Jan 26 2013, 21:04
|- - _Pasha   Цитата(Golikov A. @ Jan 27 2013, 00:04) к...   Jan 26 2013, 21:12
- - Golikov A.   Можете расписать что происходит при записи допусти...   Jan 26 2013, 21:15
|- - _Pasha   Цитата(Golikov A. @ Jan 27 2013, 00:15) М...   Jan 26 2013, 21:18
- - Golikov A.   ну да естественно как виртуальная машина обрабатыв...   Jan 26 2013, 21:23
- - _Pasha   Выбрали запись. Декодировали команду >>24 ...   Jan 26 2013, 21:35
- - Golikov A.   ну все я понял в чем маза. это короче разница та...   Jan 26 2013, 21:44
|- - _Pasha   Цитата(Golikov A. @ Jan 27 2013, 01:44) С...   Jan 26 2013, 21:59
- - Golikov A.   Один раз вспоминается был проект где надо было сил...   Jan 26 2013, 22:08
|- - _Pasha   Цитата(Golikov A. @ Jan 27 2013, 02:08) Ф...   Jan 26 2013, 22:57
- - Golikov A.   если упростить архиватор, и скармливать ему линейн...   Jan 26 2013, 23:42
|- - _Pasha   Цитата(Golikov A. @ Jan 27 2013, 03:42) е...   Jan 27 2013, 00:50
|- - HHIMERA   Цитата(_Pasha @ Jan 27 2013, 04:50) В раб...   Jan 27 2013, 09:10
- - AlexandrY   Цитата(_Pasha @ Jan 26 2013, 13:15) От пр...   Jan 27 2013, 09:46
- - _Pasha   Цитата(HHIMERA @ Jan 27 2013, 13:10) Лучш...   Jan 27 2013, 09:55
- - khach   Обычно в одном куске кода работаем с одной перифер...   Jan 27 2013, 10:05


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 06:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016