LINUX.ORG.RU

Сообщения amaora

 

Как переключать контекст в pthread

В небольшой самописной rtos для МК выделяю HAL и пытаюсь запускать её поверх pthread. Для отладки, даже не самой rtos а кода в ней работающего.

Исходная идея была такая. При создании задачи в rtos происходит инициализация стека, в этом месте ставим hal вызов. В нем создается thread и его id записывается на стек. Планировщик вместо сохранения/восстановления контекста берет id и делает suspend/resume. Исходно все thread должны быть созданы в остановленном состоянии.

Но вот начал реализовывать, а suspend/resume то и нет. Похоже только как-то через сигналы можно это сделать, да?

Как создавать thread в остановленном состоянии? делать обертку над start_routine?

 ,

amaora
()

Периодически отключается

Проявляется только при слабом сигнале, держится от нескольких секунд до нескольких минут.

wlan0     IEEE 802.11bgn  ESSID:"DIR-615"  
          Mode:Managed  Frequency:2.417 GHz  Access Point: AC:F1:DF:29:42:4E   
          Bit Rate=6 Mb/s   Tx-Power=19 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=30/70  Signal level=-80 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:21   Missed beacon:0
Aug 23 19:32:25 fakemoon dhcpcd[5581]: wlan0: carrier lost
Aug 23 19:32:25 fakemoon kernel: brcmsmac bcma0:0: brcmsmac: brcms_ops_bss_info_changed: disassociated
Aug 23 19:32:25 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_bss_info_changed: arp filtering: enabled false, count 1 (implement)
Aug 23 19:32:25 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_bss_info_changed: qos enabled: false (implement)
Aug 23 19:32:25 fakemoon kernel: cfg80211: Calling CRDA to update world regulatory domain
Aug 23 19:32:25 fakemoon kernel: cfg80211: World regulatory domain updated:
Aug 23 19:32:25 fakemoon kernel: cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
Aug 23 19:32:25 fakemoon kernel: cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:25 fakemoon kernel: cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:25 fakemoon kernel: cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:25 fakemoon kernel: cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:25 fakemoon kernel: cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:26 fakemoon nscd: 5834 cannot stat() file `/var/db/passwd.db': No such file or directory
Aug 23 19:32:26 fakemoon nscd: 5834 cannot stat() file `/var/db/group.db': No such file or directory
Aug 23 19:32:26 fakemoon kernel: wlan0: authenticate with ac:f1:df:29:42:4e
Aug 23 19:32:26 fakemoon kernel: wlan0: send auth to ac:f1:df:29:42:4e (try 1/3)
Aug 23 19:32:26 fakemoon kernel: wlan0: authenticated
Aug 23 19:32:26 fakemoon kernel: wlan0: associate with ac:f1:df:29:42:4e (try 1/3)
Aug 23 19:32:26 fakemoon kernel: wlan0: RX AssocResp from ac:f1:df:29:42:4e (capab=0x411 status=0 aid=1)
Aug 23 19:32:26 fakemoon kernel: brcmsmac bcma0:0: brcmsmac: brcms_ops_bss_info_changed: associated
Aug 23 19:32:26 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_bss_info_changed: arp filtering: enabled true, count 0 (implement)
Aug 23 19:32:26 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_bss_info_changed: qos enabled: true (implement)
Aug 23 19:32:26 fakemoon kernel: wlan0: associated
Aug 23 19:32:26 fakemoon dhcpcd[5581]: wlan0: carrier acquired
Aug 23 19:32:27 fakemoon dhcpcd[5581]: wlan0: sending IPv6 Router Solicitation
Aug 23 19:32:27 fakemoon dhcpcd[5581]: wlan0: rebinding lease of 192.168.1.3
Aug 23 19:32:30 fakemoon dhcpcd[5889]: sending signal 1 to pid 5581
Aug 23 19:32:30 fakemoon dhcpcd[5889]: waiting for pid 5581 to exit
Aug 23 19:32:30 fakemoon dhcpcd[5581]: received SIGHUP, releasing
Aug 23 19:32:30 fakemoon dhcpcd[5581]: wlan0: removing interface
Aug 23 19:32:31 fakemoon kernel: wlan0: deauthenticating from ac:f1:df:29:42:4e by local choice (reason=3)
Aug 23 19:32:31 fakemoon kernel: brcmsmac bcma0:0: brcmsmac: brcms_ops_bss_info_changed: disassociated
Aug 23 19:32:31 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_bss_info_changed: arp filtering: enabled false, count 0 (implement)
Aug 23 19:32:31 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_bss_info_changed: qos enabled: false (implement)
Aug 23 19:32:31 fakemoon kernel: cfg80211: Calling CRDA to update world regulatory domain
Aug 23 19:32:31 fakemoon kernel: cfg80211: World regulatory domain updated:
Aug 23 19:32:31 fakemoon kernel: cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
Aug 23 19:32:31 fakemoon kernel: cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:31 fakemoon kernel: cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:31 fakemoon kernel: cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:31 fakemoon kernel: cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:31 fakemoon kernel: cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Aug 23 19:32:31 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_bss_info_changed: qos enabled: false (implement)
Aug 23 19:32:31 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_config: change power-save mode: false (implement)
Aug 23 19:32:31 fakemoon kernel: IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
Aug 23 19:32:31 fakemoon dhcpcd[5933]: dhcpcd not running
Aug 23 19:32:31 fakemoon kernel: atl1c 0000:01:00.0: irq 46 for MSI/MSI-X
Aug 23 19:32:31 fakemoon kernel: IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
Aug 23 19:32:35 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_bss_info_changed: qos enabled: false (implement)
Aug 23 19:32:35 fakemoon kernel: brcmsmac bcma0:0: brcms_ops_config: change power-save mode: false (implement)
Aug 23 19:32:35 fakemoon kernel: IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready

Но оно же работает, что мешает не дергать dhcp и не терять IP адрес? Что можно сделать?

 

amaora
()

Средства сборки на замену make

Главный критерий выбора, инструмент должен быть простым. То есть я не хочу связываться с cmake/autotools и подобными, проверка внешних зависимостей мне не нужна.

Собираю обычно мелкие проектики на C, и уже устал постоянно допиливать Makefile. Хочеться результат сборки положить в отдельную директорию, не так просто заставить make это делать. Разложить исходники по разным директориям, снова make сопротивляется. Ещё какие-то более мелкие проблемы (пересборка с новыми CFLAGS например).

Хотя подозреваю, что никакой подходящей замены не существует.

Добавка: впомнил про mk (p9port) и нашел aap, посмотрю.

 

amaora
()

Самостарт сетового интрефейса

При подключении android устройсва через usb-хвост появляется интерфейс usb0. Поднятие и запуск dhcpcd работает,

# /etc/init.d/net.usb0 start

но хочется, чтобы оно стартовало само при появлении usb0. Какие есть правильные способы это сделать?

Если это важно, eudev.

 ,

amaora
()

Зачем тэги храняться в .hgtags?

1. Дополнительные коммиты засоряют историю.

2. Если сделать update на ревизию где нет какого либо тега или самого файла .hgtags то список тегов все же доступен, странно, какой смысл в коммитах тогда? Хотя если было бы иначе, то тоже было бы странно.

3. Не проверял, но возникают вопросы, что будет при слиянии веток с разными .hgtags?

 

amaora
()

Файлопередача

Сеть через bt не поднялась, может хотябы файлы предам.

$ hcitool scan
Scanning ...
        2C:26:C5:DB:68:2A       ZTE V880E
$ obexftp -b 2C:26:C5:DB:68:2A -v -p .xinitrc 
Browsing 2C:26:C5:DB:68:2A ...
Connecting...failed: connect
Tried to connect for 2ms
error on connect(): Invalid argument
Still trying to connect
Connecting...failed: connect
Tried to connect for 3ms
error on connect(): Invalid argument
Still trying to connect
Connecting...failed: connect
Tried to connect for 3ms
error on connect(): Invalid argument
Still trying to connect

В обратную сторону не понятно. что надо делать.

$ obexftpd -b 
Waiting for connection...

Оно вот так молча висит а отправка файла с удаленной стороны фэйлится.

 ,

amaora
()

Сеть через BT

В новых версиях bluez пропал демон pand который упоминается во всех howto. Сходил на их страницу и даже не обнаружил документации. По манам пока смог только включить сервис (sdptool add nap), вторая сторона это обнаруживает. Как поднять сетевой интерфейс неясно. И кроме того, много вопростов возникает после джентушного wiki. Конфигурация там производиться как-то странно (в частности pairing), где-то в /var какие-то похоже генерируемые файлы правятся.

Где чего почитать?

 ,

amaora
()

Инструкции по выпиливанию

Думаю я не первый кто это хочет сделать. Чего есть почитать о том как запретить ведроиду взаимодействовать с серверами гугла без разрешения?

Спасибо.

 ,

amaora
()

Чем ещё можно работать с патчами

Попробовал shelve из tortoisehg. А что есть ещё для перекидывания изменений между разными (временными) патчами и предстоящим коммитом?

На mq уже смотрю, но что-то пока не очень ясно.

Да и можно не привязываться к конкретной vcs, ведь от нее надо только уметь делать diff.

Спасибо.

 ,

amaora
()

Один файл в двух репозиториях

Был набор исходников, без VCS. Возникла необходимость перенести часть кода (один файл) в упрощенное окружение для тестов. Сделал новый набор исходников. Сам файл был несколько модифицирован.

Теперь исходники под контролем mercurial, тестовые исходники тоже, в отдельном репозитории. Но hg не застал момента разветвления, нигде в истории этого нет.

Сценарий 1: В тестовой «ветке» фикситься баг, надо перенести в отсновную. Как? Файлы то разные, и присутствует некоторый набор изменений который туда тащить не надо.

Сценарий 2: В основной «векте» делаются изменения, надо тестить в тестовом окружении.

Мне правильно кажется, что я что-то делаю не так?

 ,

amaora
()

Передача параметров

Сейчас такой скрипт.

#!/usr/bin/gnuplot -p

set terminal x11
set grid

N = "`tee`"

if (N == 1) {

	set xlabel 'Time (Sec)'
	set ylabel 'Position (Degree)'
	plot	'OUT1' using 1:4 title 'Plant' with lines, \
		'OUT1' using 1:9 title 'Measured' with lines, \
		'OUT1' using 1:10 title 'Reference' with lines
}

if (N == 2) {

	set xlabel 'Position (Degree)'
	set ylabel 'Speed (Degree/Sec)'
	plot	'OUT1' using 4:3 title 'Plant' with lines, \
		'OUT1' using 4:8 title 'Measured' with lines
}

pause mouse close

Набирать каждый раз номер,return,^d не хорошо, помню что для таких дел было что-то более подходящее, но не помню что. Можно и через параметры было бы передать, но как не понятно.

 

amaora
()

Все сломалось

Обновлялся вчера с 171-r9 до eudev, т.к. почитал eselect news про переход на 19x версии. Однако после рестарта процесс запуска застрял говоря что-то про CONFIG_DEVTMPFS=y который у меня не включен. Запустился с live-flash вернулся на 171-r10 (r9 уже не было), странно, но ничего не поменялось. Достал бэкап, кое как вернул все на место (на самом деле куча проблем, видимо из-за того, что я не удалил файлы новых версий udev).

В сообщениях было ещё писано про libudev.so.0 и про то, что X.org теперь отвалится, я только не понял, что же с этим делать?

Да, и revdep-rebuild я делать не забывал.

Где почитать, куда надо обновляться?

Спасибо.

 , ,

amaora
()

Возврат нескольких значений из функции

В некторых функциях иногда возникает необходимость вернуть несколько значений. Какие для этого есть красивые способы? Я знаю следующие,

1. Самое простое, через глобальные переменные, некрасиво. 2. Запись по преданному адресу, толсто и медлительно. 3. Возврат длинного слова (в регистрах) составленного из нескольких значений. Есть варианты через битовые сдвиги или union. Красивый макрос написать не получается, то то (typeof не работает, expected specifier-qualifier-list before ‘typeof’), то се (начинается использование стека при взятии адреса, хотя мне надо только тип сменить без последствий). Да и ещё в месте вызова надо это слово парсить на куски. Но все же это пока лучший из известных мне вариантов.

Язык C, компилятор avr-gcc.

	x = s2i(s);

	ri = (s16_t) (x & 0xFFFF);
	s = (const char *) (u16_t) (x >> 16);

 

amaora
()

Какие есть новые игры с софтверной растеризацией?

Чтобы как в q1 квадраты на текстурах и 256 цветов. Без использования OpenGL. Но только не псевдо 3д клоны doom.

 ,

amaora
()

Как надо перемещать группу модулей?

Пытался выделять рамкой, скрывать верхний слой (пады, дороги, отдельно), чтобы переместить группу модулей на нижнем слое (зеленый, там sot23-5 и резисторы вокруг него). Но ничего не помогает, всегда цепляется ещё и несколько модулей с верхнего слоя.

До - http://ompldr.org/vZnBuOA После - http://ompldr.org/vZnBuaQ

 ,

amaora
()

Как нормально сконфигурить?

Сейчас чтобы начать печатать, делаю сдледующие действия.

Sep 15 20:42:02 fakemoon kernel: usb 1-1: new high-speed USB device number 7 using ehci_hcd
Sep 15 20:42:02 fakemoon kernel: usb 1-1: New USB device found, idVendor=03f0, idProduct=4117
Sep 15 20:42:02 fakemoon kernel: usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Sep 15 20:42:02 fakemoon kernel: usb 1-1: Product: HP LaserJet 1018
Sep 15 20:42:02 fakemoon kernel: usb 1-1: Manufacturer: Hewlett-Packard
Sep 15 20:42:02 fakemoon kernel: usb 1-1: SerialNumber: KP3CB8W

# modprobe usblp

Sep 15 20:42:56 fakemoon kernel: usb 1-1: new high-speed USB device number 8 using ehci_hcd
Sep 15 20:42:56 fakemoon kernel: usb 1-1: New USB device found, idVendor=03f0, idProduct=4117
Sep 15 20:42:56 fakemoon kernel: usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Sep 15 20:42:56 fakemoon kernel: usb 1-1: Product: HP LaserJet 1018
Sep 15 20:42:56 fakemoon kernel: usb 1-1: Manufacturer: Hewlett-Packard
Sep 15 20:42:56 fakemoon kernel: usb 1-1: SerialNumber: KP3CB8W
Sep 15 20:42:56 fakemoon kernel: usblp0: USB Bidirectional printer dev 8 if 0 alt 0 proto 2 vid 0x03F0 pid 0x4117

# modprobe -r usblp
# echo /sbin/hotplug > /proc/sys/kernel/hotplug

Sep 15 20:43:43 fakemoon kernel: usb 1-1: new high-speed USB device number 9 using ehci_hcd
Sep 15 20:43:43 fakemoon kernel: usb 1-1: New USB device found, idVendor=03f0, idProduct=4117
Sep 15 20:43:43 fakemoon kernel: usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Sep 15 20:43:43 fakemoon kernel: usb 1-1: Product: HP LaserJet 1018
Sep 15 20:43:43 fakemoon kernel: usb 1-1: Manufacturer: Hewlett-Packard
Sep 15 20:43:43 fakemoon kernel: usb 1-1: SerialNumber: KP3CB8W

# modprobe usblp

Sep 15 20:44:19 fakemoon kernel: usb 1-1: new high-speed USB device number 10 using ehci_hcd
Sep 15 20:44:19 fakemoon kernel: usb 1-1: New USB device found, idVendor=03f0, idProduct=4117
Sep 15 20:44:19 fakemoon kernel: usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Sep 15 20:44:19 fakemoon kernel: usb 1-1: Product: HP LaserJet 1018
Sep 15 20:44:19 fakemoon kernel: usb 1-1: Manufacturer: Hewlett-Packard
Sep 15 20:44:19 fakemoon kernel: usb 1-1: SerialNumber: KP3CB8W
Sep 15 20:44:19 fakemoon kernel: usblp0: USB Bidirectional printer dev 10 if 0 alt 0 proto 2 vid 0x03F0 pid 0x4117
Sep 15 20:44:19 fakemoon /etc/hotplug/usb/hplj1018: foo2zjs: loading HP LaserJet 1018 firmware /usr/share/foo2zjs/firmware/sihp1018.dl to /dev/usb/lp0 ...
Sep 15 20:44:19 fakemoon /etc/hotplug/usb/hplj1018: foo2zjs: loading HP LaserJet 1018 firmware /usr/share/foo2zjs/firmware/sihp1018.dl to /dev/usblp0 ...
Sep 15 20:44:19 fakemoon /etc/hotplug/usb/hplj1018: foo2zjs: ... download failed.
Sep 15 20:44:20 fakemoon /etc/hotplug/usb/hplj1018: foo2zjs: ... download successful.

Печатаю, но обработка стрянет.

▼ ID ▼	Name	User	Size	Pages	State	Control
HP_LaserJet_1018-53 	Unknown 	Withheld 	77k 	1 	 processing since

Sat 15 Sep 2012 08:45:58 PM MSK 
"Waiting for printer to become available."

Делаю.

modprobe -r usblp

Начинается печать.

Как можно нормально это сконфигурить? Надоело каждый раз все делать. А иногда ещё и забывать (печатаю ~два раза в год) и разбираться повторно из-за чего не работает.

Для hotplug скриптов отправляющих firmware нужен usblp. Для работы cups же он мешает.

И ещё hotplug не включен, не понятно где это должно быть сделано.

 , , ,

amaora
()

Наблюдатель нелинейной динамической системы

Где ещё можно спросить не знаю.

Есть динамическая система с некоторыми нелинеяностями связанными с вращательным движением. Если записать её уравннения в пространтсве состояний для непрерывного времени то они будут содержать произведения элементов вектора состояния.

Надо синтезировать наблюдатель для этой системы. Есть ограничения по сложности метода, скажем адаптации фильтра Калмана для нелинейного случая (EKF/UKF) слишком вычислительно тяжелы.

Почитав про MRAC и градиентный идентификатор, возникла идея сделать градиентный наблюдатель. Сейчас играюсь с моделью и этим наблюдателем в octave. Похоже оно работает. Суть метода проста.

x_{n+1} = F(x_n)
z_n = H x_n

Набюдатель линейный. Пока полагаем, что модель системы известна точно.

y'_{n+1} = F(y_n)
w_n = H w_n
e_n = z_n - w_n
y_n = y'_n + e K

Отличие от линейных наблюдателей только в выборе K. Для этого записываем оценку отклонения.

d = e^2

И находим градиент d в пространстве состояний дискретизованной по времени системы. Получаем нечто следующее для матрицы K.

K_ij = u dF_i/dx_j

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

Вопрос в оптимальности (максимально возможном быстродействии) такого метода. Нигде не нашел упоминаний подобного применительно к имеено наблюдателям. Хотелось почитать что либо по теме, возможно есть какие либо `улучшения` этого метода, способы выбора оптимального u, ещё что-то.

И ещё вероятно скоро потребуется идентификатор (определение точных параметров системы), и все идеи опять же заканчиваются на градиентном методе.

И последнее, есть такой способ регулирования `sliding mode control`, он же может быть использован и в наблюдателе. Как я понимаю, нужно всего лишь исключить зависимость поправки от величины ошибки и для дискретного случая вычислять длину шага так, чтобы оказатся на поверхности где ошибка равна нулю. Но польза этого не очевидна. И даже появляются сомнения о вреде при наличии ошибки измерения (шума) выхода настоящей системы.

 control theory

amaora
()

Два сегмента по одному адресу

Такой скрипт,

MEMORY
{
	RAM (rwx)	: ORIGIN = 0x20000000, LENGTH = 6K
	FLASH (rx)	: ORIGIN = 0x08000000, LENGTH = 16K
}

SECTIONS
{
	.isr : ALIGN(4)
	{
		ld_sisr = . ;

		KEEP(*(.isr))

	} > RAM

	.text : ALIGN(4)
	{
		*(.text)
		*(.text.*)
		*(.rodata)
		*(.rodata.*)
 
		. = ALIGN(4);
		ld_etext = . ;

	} > RAM

	...

и такой код,

.syntax unified
.cpu cortex-m3
.thumb

.section .isr

	.word 0
	.word isr_reset
	.word 0
	.word 0
	.word 0
	.word 0
	.word 0
	.word 0
	.word 0
	.word 0

.section .text

.global isr_reset

isr_reset:

	bl motor_entry

а результат,

$ make dump
  ODUMP  bldc.elf

bldc.elf:     file format elf32-littlearm


Disassembly of section .isr:

20000000 <ld_sisr>:
20000000:       00000000        andeq   r0, r0, r0
20000004:       20000000        andcs   r0, r0, r0
        ...

Disassembly of section .text:

20000000 <isr_reset>:
20000000:       f000 f800       bl      20000004 <motor_entry>

20000004 <motor_entry>:
20000004:       e7fe            b.n     20000004 <motor_entry>
        ...

почему .text кладется в начало RAM, если там уже расположена .isr? Судя по манам такого быть не должно, и не происходит с другими секциями.

 ,

amaora
()

hotplug в gentoo

Непонятно.

/etc/init.d/udev

133         if [ -e /proc/sys/kernel/hotplug ]; then
134                 echo "" >/proc/sys/kernel/hotplug
135         fi

Если вручную записать туда /sbin/hotplug то начинает работать. Но как должно быть?

 , ,

amaora
()

[gcc][avr] Оптимизация делает хуже

Наверно ещё рано идти в багтрекер, возникает вопрос зачем это сделано и нельзя ли отключить.

u16_t u_mul_u16_u88_rough(u16_t x, u16_t m)
{
	union { u16_t s; u8_t b[2]; }	um;

	u16_t		r = 0;
	u8_t		i = 1;

	um.s = m;

	do {
		if (um.b[0] & i) {

			r += x;
		}

		r >>= 1;
		i <<= 1;
	}
	while (i != 0);

	i = 1;

	do {
		if (um.b[1] & i) {

			r += x;
		}

		x <<= 1;
		i <<= 1;
	}
	while (i != 0);

	return r;
}

$ avr-gcc -c util.c -Wall -pipe -std=c99 -Os -fconserve-stack -fno-strict-aliasing -mmcu=atmega16 -S

.global	u_mul_u16_u88_rough
	.type	u_mul_u16_u88_rough, @function
u_mul_u16_u88_rough:
/* prologue: function */
/* frame size = 0 */
/* stack size = 0 */
.L__stack_usage = 0
	ldi r20,lo8(8)
	ldi r21,hi8(8)
	ldi r30,lo8(1)
	ldi r18,lo8(0)
	ldi r19,hi8(0)
.L29:
	mov r31,r30
	and r31,r22
	breq .L28
	add r18,r24
	adc r19,r25
.L28:
	lsr r19
	ror r18
	lsl r30
	subi r20,lo8(-(-1))
	sbci r21,hi8(-(-1))
	brne .L29
	ldi r20,lo8(8)
	ldi r21,hi8(8)
	ldi r22,lo8(1)
.L32:
	mov r30,r22
	and r30,r23
	breq .L30
	add r18,r24
	adc r19,r25
.L30:
	lsl r22
	subi r20,lo8(-(-1))
	sbci r21,hi8(-(-1))
	breq .L31
	lsl r24
	rol r25
	rjmp .L32
.L31:
	movw r24,r18
/* epilogue start */
	ret

Добавляется новый счетчик цикла в регистрах r20/r21 который, только не ясно зачем. На x86 тоже происходит что-то похожее. Но зачем? инструкция сдвига или сложения уже ставит флаги и следующей инструкцией уже может быть условный переход.

Если передать i как параметр функции то первый цикл становиться таким.

	ldi r18,lo8(0)
	ldi r19,hi8(0)
.L29:
	mov r21,r20
	and r21,r22
	breq .L28
	add r18,r24
	adc r19,r25
.L28:
	lsr r19
	ror r18
	lsl r20
	brne .L29

Вот так и надо, было.

 ,

amaora
()

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