LINUX.ORG.RU

Сообщения Selat

 

Как правильно настраивать DNS?

У моего провайдера по вечерам сильно замедляется DNS: google.com резолвится секунд 20. В связи с этим я решил перейти на гугловский 8.8.8.8. Настроил этот DNS в маршрутизаторе и в самой системе:

$ cat /etc/resolv.conf
# Generated by resolvconf
nameserver 8.8.8.8

Вышеописанные изменения почему-то ничего не ускорили, несмотря на то, что DNS сервер пингуется с задержкой в 20-30 миллисекунд.

ЧЯДНТ?

 

Selat
()

GCC аппаратный float для arm

Есть вот такая функция для тестирования fpu:

float __attribute__ ((noinline)) testfpu(float a) {
	return __builtin_sqrtf(__builtin_sqrtf(__builtin_sqrtf(a)));
}
Для неё GCC генерирует следующий код:
/ (fcn) sym.testfpu (thumb) 80
|           ; CALL XREF from 0x08001cb6 (sym.testfpu)
|           0x08001c50      b1eec07a       vsqrt.f32 s14, s0
|           0x08001c54      08b5           push {r3, lr}
|           0x08001c56      b4ee477a       vcmp.f32 s14, s14
|           0x08001c5a      f1ee10fa       vmrs apsr_nzcv, fpscr
|       ,=< 0x08001c5e      0ed1           bne 0x8001c7e
|       |   ; JMP XREF from 0x08001c86 (sym.testfpu)
|      .--> 0x08001c60      f1eec77a       vsqrt.f32 s15, s14
|      ||   0x08001c64      f4ee677a       vcmp.f32 s15, s15
|      ||   0x08001c68      f1ee10fa       vmrs apsr_nzcv, fpscr
|     ,===< 0x08001c6c      11d1           bne 0x8001c92
|     |||   ; JMP XREF from 0x08001c9e (sym.testfpu)
|    .----> 0x08001c6e      b1eee70a       vsqrt.f32 s0, s15
|    ||||   0x08001c72      b4ee400a       vcmp.f32 s0, s0
|    ||||   0x08001c76      f1ee10fa       vmrs apsr_nzcv, fpscr
|   ,=====< 0x08001c7a      05d1           bne 0x8001c88
|   |||||   ; JMP XREF from 0x08001c90 (sym.testfpu)
|  .------> 0x08001c7c      08bd           pop {r3, pc}
|  |||||`-> 0x08001c7e      08f067f9       bl sym.sqrtf
|  |||||    0x08001c82      b0ee407a       vmov.f32 s14, s0
|  ||||`==< 0x08001c86      ebe7           b 0x8001c60
|  |`-----> 0x08001c88      b0ee670a       vmov.f32 s0, s15
|  | ||     0x08001c8c      08f060f9       bl sym.sqrtf
|  `======< 0x08001c90      f4e7           b 0x8001c7c
|    |`---> 0x08001c92      b0ee470a       vmov.f32 s0, s14
|    |      0x08001c96      08f05bf9       bl sym.sqrtf
|    |      0x08001c9a      f0ee407a       vmov.f32 s15, s0
\    `====< 0x08001c9e      e6e7           b 0x8001c6e

Настройки компилятора:
-O2 -mfpu=vfpv4-d16 -mfloat-abi=hard
Видно, что gcc успешно использует инструкцию vsqrt для вычисления квадратного корня. Но при этом после каждой инструкции вставляются некрасивые проверки с откатом на программную реализацию в случае возникновения ошибки. Как можно избавиться от этих проверок?

PS: Забавно, что без использования FPU код получается куда проще:

/ (fcn) sym.testfpu (thumb) 18
|           ; CALL XREF from 0x08001b30 (sym.testfpu)
|           0x08001b0c      08b5           push {r3, lr}
|           0x08001b0e      08f0fff8       bl sym.sqrtf
|           0x08001b12      08f0fdf8       bl sym.sqrtf
|           0x08001b16      bde80840       pop.w {r3, lr}
\       ,=< 0x08001b1a      08f0f9b8       b.w sym.sqrtf

 , ,

Selat
()

SPI в libopencm3 под stm32f407

Дела настолько плохи, что у меня не получается даже передача данных между закороченными MISO и MOSI. в каждом нечётном отправленном байте старший бит почему-то устанавливается в 1 . Кто-нибудь сталкивался с такой проблемой?

Инициализация SPI (пины точно выбраны правильно и не конфликтуют с JTAG):

#define SPI_ID SPI1
#define SPI_RCC RCC_SPI1
#define SPI_NSS GPIO4
#define SPI_SCK GPIO5
#define SPI_MISO GPIO6
#define SPI_MOSI GPIO7
#define SPI_RCC_PORT RCC_GPIOA
#define SPI_PORT GPIOA


rcc_periph_clock_enable(SPI_RCC_PORT);
rcc_periph_clock_enable(SPI_RCC);

gpio_mode_setup(SPI_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,
                          SPI_SCK | SPI_MOSI);
gpio_mode_setup(SPI_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE,
                          SPI_MISO);
gpio_set_af(SPI_PORT, GPIO_AF5,
                      SPI_SCK | SPI_MISO | SPI_MOSI);
gpio_set_output_options(SPI_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ,
                                  SPI_SCK | SPI_MOSI);

gpio_set(SPI_PORT, SPI_NSS);
gpio_mode_setup(SPI_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SPI_NSS);

spi_reset(SPI_ID);

spi_init_master(SPI_ID, SPI_CR1_BAUDRATE_FPCLK_DIV_256, 0,
                        0, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);
spi_set_full_duplex_mode(SPI_ID);

spi_enable_software_slave_management(SPI_ID);
spi_set_nss_high(SPI_ID);
SPI_CR2(SPI_ID) |= SPI_CR2_FRF;
gpio_set(SPI_PORT, SPI_NSS);
spi_disable_crc(SPI_ID);
spi_enable(SPI_ID);

Тестирование передачи данных:

void mspi_send(uint32_t spi, uint16_t data) {
	SPI_DR(spi) = data;
	while (!(SPI_SR(spi) & SPI_SR_TXE));
}

void test() {
	uint8_t pid = 0;
	uint8_t rx_value;
	for (pid = 0; pid < 10; ++pid) {
		mspi_send(SPI_ID, pid);
		rx_value = spi_read(SPI_ID);
		printf("Received: %d - %d\n\r", (int)pid, (int)rx_value);
	}
	for (pid = 10; pid > 0; --pid) {
		mspi_send(SPI_ID, pid);
		rx_value = spi_read(SPI_ID);
		printf("Received: %d - %d\n\r", (int)pid, (int)rx_value);
		mspi_send(SPI_ID, pid);
		rx_value = spi_read(SPI_ID);
		printf("Received: %d - %d\n\r", (int)pid, (int)rx_value);
	}
}

Результаты передачи:

Received: 0 - 128
Received: 1 - 1
Received: 2 - 130
Received: 3 - 3
Received: 4 - 132
Received: 5 - 5
Received: 6 - 134
Received: 7 - 7
Received: 8 - 136
Received: 9 - 9
Received: 10 - 138
Received: 10 - 10
Received: 9 - 9
Received: 9 - 137
Received: 8 - 136
Received: 8 - 8
Received: 7 - 7
Received: 7 - 135
Received: 6 - 134
Received: 6 - 6
Received: 5 - 5
Received: 5 - 133
Received: 4 - 132
Received: 4 - 4
Received: 3 - 3
Received: 3 - 131
Received: 2 - 130
Received: 2 - 2
Received: 1 - 1
Received: 1 - 129

 , ,

Selat
()

Портирование Emacs на Common Lisp

Если предположить, что емакс - просто интерпретатор elisp с огромной библиотекой на C, то сразу приходит в голову следующих план перехода:

  1. Пишется библиотека для CL для поддержки некоторых отсутствующих фич из elisp. Тут вообще пишут, что elisp - почти подмножество CL.
  2. Пишется конвертер, преобразующих исходники библиотек на C для elisp в библиотеки для того же SBCL.

Объясните пожалуйста, в чём проблема этого метода, и почему никто так не делает?

 , , ,

Selat
()

Покритикуйте код

Написал простенький класс для парсинга арифметических выражений с поддержкой регулярок и шаблонов. Если кому не лень, подскажите, что можно исправить/улучшить/переписать. Основной файл - expression_parser.hpp

https://github.com/selat/expression-parser

 , ,

Selat
()

Задачи по физике и матан

Посоветуйте задач по физике, которые требуют знания матана на уровне Демидовича (интегралы, арифметическое пространство, функции нескольких переменных, частные производные и т.д.). Хочется укрепить знания с помощью более реальных примеров...

 , ,

Selat
()

Быдлокод

Почему это компилится и как работает?

int i, a[]={0,0,0};
for (i = 0 ; i < 3; i++)
{
	cout << i[a];
	int a = i;
	int i[] = {4,5,6};
	cout << a[i] << ' ';
}

 ,

Selat
()

Common lisp package manager

Есть ли сабж для SBCL, как в Emacs?

Selat
()

C++ вызов конструктора.

Можно ли явно вызвать конструктор, используя память, ранее выделенную под другой тип?

class A
{
    int b;
};

int main()
{
    uint8_t* data = new uint8_t[sizeof A];
    A* a = callAConstructor(data);
    return 0;
}

 ,

Selat
()

Тестирование решений

Есть ли библиотека для тестирования решений задач по спортивному программированию (ML, TL, RE...)? Или придётся выковыривать из ejudge?

Selat
()

fontconfig не обновляет кеш

Собственно, ошибка:

Re-scanning /usr/share/fonts: /usr/share/fonts: error scanning
Re-scanning /usr/share/fonts/encodings: /usr/share/fonts/encodings: error scanning
Версия 2.11.1. ЧЯДНТ?

Selat
()

Сменить пользователя в python.

Доброго времени суток. Есть cgi скрипт на python. Нужно залогиниться под определённым пользователем и записать какой-нибудь файл в домашней директории. С login вообще не получается (даже если просто в терминале вводить, он закрывается). Пробовал так

subprocess.call(shlex.split("su -l user"), stdin=open("password.txt", "r"))
print subprocess.check_output("id") # Выводит совсем не того пользователя.
ЧЯДНТ?

Selat
()

Проблема с shutdown.

При попытке выключения:

sudo shutdown now
Вылетает вот такая ошибка:
Welcome to rescure mode! Type "systemctl default" or ^D to enter default mode.
Type "journalctl -xb" to view system logs. Type "systemctl reboot" to reboot.
Give root password for maintenance
При этом при использовании halt и «shutdown -r now» подобных проблем не возникает. Как можно исправить?

Selat
()

Отладка в GDB.

При использовании отладчика gdb возникают странные временные баги со звуком. Иногда при выполнении команды next звук полностью пропадает, при повторном - восстанавливается. При этом и в наушниках и колонках. Может ли быть дело в том, что gdb цепляет какую-то библиотеку для работы со звуком, используемую отлаживаемой программой?

 ,

Selat
()

Ускорение загрузки системы.

Какие есть способы ускорения загрузки системы? При сборке ядра я отключил все заведомо ненужные модули. OpenRC загружает около 15 программ. Но при всём этом время загрузки системы около минуты, что иногда довольно сильно раздражает. У моего знакомого на Ubuntu загрузка происходит всего за секунд 10 с обычного жёсткого диска.

И ещё один вопрос. У меня для поддержки нормального разрешения экрана на ноуте нужен интеловский драйвер. Но модуль с ним загружается чуть ли ни в последнюю очередь, так что первые секунд 20 загрузки - лог с разрешением 640x480. Можно ли это как-то исправить?

 , ,

Selat
()

Сохранение буфера в Emacs.

Как заставить Emacs сохранять буфер так, как он отображается в редакторе? При сохранении файла Emacs оставляет только один tab в начале строки - как я понимаю буфер автоматически форматируется при загрузке файла.

 

Selat
()

RSS подписка на новые темы