Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

Пара непонятных моментов по языку СИ

Непрочитано 12.03.2013, 08:19  
baiderin
Почётный гражданин KAZUS.RUN
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,739
Сказал спасибо: 2,487
Сказали Спасибо 897 раз(а) в 584 сообщении(ях)
baiderin на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

Сообщение от DK Посмотреть сообщение
Мне, например, ОЧЕНЬ тяжко понимать (
Абсолютно поддерживаю. Я хоть и начинал изучение программирования сразу на С,но подобные выражения меня также загоняют в ступор. Ну железячные мозги у меня.А программирование затянуло и не опускает. Вот и ковыряюсь каждый раз в подобных дебрях.Ну и что,что читал я эти книги неоднократно. Поразному это все укладывается в голове у каждого.
Реклама:
baiderin вне форума  
Непрочитано 12.03.2013, 10:49  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

Коль пошла такая пьянка - как на С (в частности, стм32) правильно работать с флагами и битами портов? В смысле - чтобы это занимало поменьше тактов процессора. Допустим, установку и сброс бита можно сделать через битбандинг (2...4 команды - загрузка константы в регистр, пересылка регистра в битбанд-область), а как проверять их состояние? Сейчас адаптирую свой старый проект, там очень сложная логика и активно используются биты, и пока никак разогнанному до 48 МГц СТМ32Ф101 не удается догнать 20-МГц мега32... Интерфейсы не прокатывают, только программная логика и ногодрыг. Keil
niXto вне форума  
Непрочитано 12.03.2013, 11:00  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

Сообщение от DK Посмотреть сообщение
И вот такая конструкция... (void*)&Next
Язык Си очень красивый, на мой взгляд. Он относится к языкам среднего уровня. Это значит, что им можно пользоваться и как языком высокого уровня и как языком низкого уровня тита ассемблера. Но за это берётся плата... А именно отсутствие контроля за переменными. Это возлагается на программиста. Считается что он понимает что делает.
Зато всё на виду. Понятно, во что скомпилируется та либо иная конструкция....
Откуда растёт приведенное выражение очень просто понять. Указатель (адрес переменной) указывает на именованную величину (это ф-ция языка высокого уровня).
Приведу простой пример
struct
{
uint16_t word;
uint32_t vol;
uint8_t arr[10];
} str[10], *pstr;
я объявляю 10 элементов структуры str и указатель на структуру.
pstr = str;
я присваиваю адрес первого элемента структуры указателю. Таким образом я могу получить доступ например pstr-›vol, что будет соответствовать str[0].vol ...
Если теперь я сделаю pstr++; то это будет соответствовать переходу к следующему элементу структуры. То есть pstr-›vol будет соответствовать str[1].vol ... Надо иметь ввиду, что по сути ваша операция будет означать прибавить к адресу размер элемента структуры. Внимание! Этот размер будет разный на разных процессорах. На AVR он будет равен 16, на ARM7 он будет равен 18. Но вас от этих расчётов освобождает компилятор, чем избавляет от ошибки.
Если я пишу (void *)pstr - значит я указываю компилятору, что я хочу рассматривать указатель, как указатель не привязанный к конкретному типу. Это даёт мне возможность работать с адресами как таковыми. Надо понимать, что это не есть операция. Это указание компилятору по работе с данной переменной. Это важно.
Приведу пример
(void *)pstr = (void *)&str[5].arr[6];
uint16_t i;
i = *(uint16_t *)pstr;
Первой строкой я присвоил адрес 6 байта массива arr 5 элемента структуры str. Далее я рассматриваю 6 и 7 байты массива arr как целое число 16 бит и заношу его в переменную i...
SasaVitebsk вне форума  
Сказали "Спасибо" SasaVitebsk
igor1000 (12.03.2013)
Непрочитано 12.03.2013, 11:13  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

Сообщение от niXto Посмотреть сообщение
Коль пошла такая пьянка - как на С ...
Я коментировать не буду ... Я бы работал как работал. С указанием ...
Код:
typedef struct {
	U32 Restrict: 6;
	U32 ADC_sclk: 1;
	U32 ADC_in: 1;	 // Âûõîä ñ ÀÖÏ
	U32 ADC_out: 1;  // Âõîä ñ ÀÖÏ
	U32 ADC_cs: 1;
	U32 Restrict2: 10;
	U32 bKEY_OUT: 4;
	U32 Restrict3: 3;
	U32 bKEY_IN: 4;
	U32 Restrict4: 2;
} ADC_PIN __attribute__((bitband));
Это Keil.

У меня перенос проекта с atmega640 14.74 кварц на lpc2106 с таким же кварцем (*4) выигрыш более 10 раз, при росте размера кода в 1.6 раза.
SasaVitebsk вне форума  
Сказали "Спасибо" SasaVitebsk
niXto (12.03.2013)
Непрочитано 12.03.2013, 11:41  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

У меня тоже тоже само тело программы выполняется уже на 24 МГц раза в 2 быстрее чем на Меге, несмотря на то что там код писан почти на АСМе. Но в области логики с битовыми операциями сравнений-пересылок провал, Мега на 20 МГц выполняет подпрограмму 40 мкс, стм32ф100 - больше 100 мкс. Для проекта это очень критично, поэтому и переношу его на современный 32-битник.

Проблема в том, что у стм32 нет битовых команд (проверка бита и переход, установить-сбросить бит без предварительного сохранения рабочего регистра, загрузки в него константы, пересылки и восстановления состояния). Как это можно обойти с мЕншими потерями?
niXto вне форума  
Непрочитано 12.03.2013, 12:01  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

Это надо принять как должное - три такта установить бит, 4 такта - поверка бита и переход (правда если это одно разовое прменение),

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

А так - максимальное быстродействие токо на АСМе получите
Boba_spb вне форума  
Непрочитано 12.03.2013, 12:14  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

Никто не обещает светлое будущее. Каждый процессор для своего применения. Один хорош в том, другой в этом. Иначе не нужны были бы десятки производителей ..
И тем не менее всё не так однозначно. Например вы упёрлись в вылизывание тактов на единичную операцию. Я не знаю ваш алгоритм, но возможно, не верен сам полход? Например, тот проект который привёл я. Я подошёл по-другому. Я делал групповую обработку. групповой вывод был не возможен у меня, а вот групповую обработку я реализовал. Я сразу обрабатывал 32 бита то есть 8 операций за раз. В модеме я тоже групповую обработку использовал. Скремблирование нужно делать побитно... Я рассмотрел, пересчитал, и делал сразу скремблирование 8 точек.
Оптимизация может выполняться на разных уровнях ...
PS: В новом проекте ногодрыгом подключён дисплей wg12864. Первый вариант просто чуть ползал. Сейчас перерисовка незаметна глазу. Я поверул шрифты, переписал драйвер делаю групповой вывод.

Последний раз редактировалось SasaVitebsk; 12.03.2013 в 12:23.
SasaVitebsk вне форума  
Непрочитано 12.03.2013, 16:05  
wellcom
Временная регистрация
 
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
wellcom на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

Сообщение от SasaVitebsk Посмотреть сообщение
Код:
typedef struct {
	U32 Restrict: 6;
	U32 ADC_sclk: 1;
	U32 ADC_in: 1;	 // Âûõîä ñ ÀÖÏ
	U32 ADC_out: 1;  // Âõîä ñ ÀÖÏ
	U32 ADC_cs: 1;
	U32 Restrict2: 10;
	U32 bKEY_OUT: 4;
	U32 Restrict3: 3;
	U32 bKEY_IN: 4;
	U32 Restrict4: 2;
} ADC_PIN __attribute__((bitband));
Это Keil.
.
Будьте добры, обьясните, что дает этот артибут __attribute__((bitband))??? Что такое bitband я знаю.
wellcom вне форума  
Непрочитано 12.03.2013, 16:19  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

Собственно врятли я помогу больше чем help
Код:
__attribute__((bitband))
RealView Compilation Tools for µVision Compiler Reference Guide Version 4.0 
 
Home › Compiler-specific Features › Type attributes › __attribute__((bitband)) 

4.4.1. __attribute__((bitband))
The __attribute__((bitband)) is a type attribute that enables you to map a complete word of memory onto a single bit in the bit-band region. This enables efficient atomic access to single-bit values in SRAM and Peripheral regions of the memory architecture. Example 4.6 illustrates the use of __attribute__((bitband)).

Example 4.6. Using __attribute__((bitband))

typedef struct {
    int i: 1;
    int j: 2;
    int k: 3;
} BB __attribute__((bitband));

BB bb __attribute__((at(0x20000004)));

void foo(void)
{
    bb.i = 1;
}


For peripherals that are width-sensitive, byte, halfword, and word stores or loads to the alias space are generated for char, short, and int types of bitfields of bit-banded structs respectively.

In Example 4.7 bit-banded access is generated for bb.i.

Example 4.7. Bitfield bit-band access

typedef struct {
    char i: 1;
    int j: 2;
    int k: 3;
} BB __attribute__((bitband));

BB bb __attribute__((at(0x20000004)));

void foo()
{
    bb.i = 1;
}


If you do not use __attribute__((at())) to place the bit-banded variable in the bit-band region then you must relocate it using another method. You can do this by either using an appropriate scatter-loading description file or by using the --rw_base linker command-line option. See the Linker Reference Guide for more information.

Restrictions
The following restrictions apply:

This type attribute can only be used with struct. Any union type or other aggregate type with a union as a member cannot be bit-banded.

Members of structs cannot be bit-banded individually.

Bit-banded accesses are generated only for single-bit bitfields.

Bit-banded accesses are not generated for const objects, pointers, and local objects.

See also
__attribute__((at(address)))

Bit-banding in the Compiler User Guide

Technical Reference Manual for your processor.

Copyright © 2007, 2008 ARM Limited. All rights reserved. ARM DUI 0376B 
Non-Confidential Unrestricted Access 
  PDF version 
Home › Compiler-specific Features › Type attributes › __attribute__((bitband))
SasaVitebsk вне форума  
Непрочитано 12.03.2013, 16:24  
wellcom
Временная регистрация
 
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
wellcom на пути к лучшему
По умолчанию Re: Пара непонятных моментов по языку СИ

Сообщение от SasaVitebsk Посмотреть сообщение
Собственно врятли я помогу больше чем help
думал на пальцах сможете растолковать....тогда Help буду читать, в общем на сколько я понял имеется доступ к битовым полям с помощью bitband.

Последний раз редактировалось wellcom; 12.03.2013 в 16:26.
wellcom вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Комплементарная пара LORDCaric Информация по радиокомпонентам 2 19.11.2012 10:12
Лингвистический вопрос, по русскому языку!!! Sukhanov Отвлекитесь, эмбеддеры! 860 13.10.2010 16:18
DS18B20 и витая пара. Mishanya_82 Делимся опытом 6 25.03.2010 09:58
Комплементарная пара транзисторов SFA Информация по радиокомпонентам 19 21.05.2009 14:35
Help! Вопрос по языку Си ? nikhome Микроконтроллеры, АЦП, память и т.д 3 07.05.2008 07:23


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.