Создать ответ 
 
Рейтинг темы:
  • Голосов: 0 - Средняя оценка: 0
  • 1
  • 2
  • 3
  • 4
  • 5
вызов функции на С
Автор Сообщение
SWAT Не на форуме
Администратор
*******

Сообщений: 7245
Зарегистрирован: 04.01.2005
Рейтинг: 30
Сказал спасибо: 149
Поблагодарили 1218 раз(а) в 765 сообщ.
Сообщение: #41
RE: вызов функции на С
А в KATANA SDK и тредов то нету, так, зачаток один валяется. Так что игры активно использовали именно прерывания.
Да в этой задаче по сути и не нужны треды. Нужен двойной буфер, на один натравил привод, пока он читает в него, ты пишешь на карту другой. Когда прерывание дернулось от привода, ты - ага щас, подожди допишу - дописал - натравил на другой буфер привод, а сам пишешь тот что только что заполнился и т.д.
Будет экономится время процессора, которое он простаивал во время чтения диска, что в итоге больше даст времени для записи на карту, где оно нужнее.

[Изображение: barbers.png]
(Последний раз сообщение было отредактировано 17.02.2014 в 16:09, отредактировал пользователь SWAT.)
17.02.2014 16:08
Вебсайт Найти все сообщения Цитировать это сообщение
megavolt85 Не на форуме
Супермодератор
******

Сообщений: 3165
Зарегистрирован: 24.03.2012
Рейтинг: 38
Сказал спасибо: 186
Поблагодарили 1561 раз(а) в 919 сообщ.
Сообщение: #42
RE: вызов функции на С
SWAT где можно почитать о прерываниях в KOS

HKT-3030, Bios mod, SD mod, VGA internal mod, G1ATA mod, Region changer mod, PSU mod
17.02.2014 17:47
Найти все сообщения Цитировать это сообщение
SWAT Не на форуме
Администратор
*******

Сообщений: 7245
Зарегистрирован: 04.01.2005
Рейтинг: 30
Сказал спасибо: 149
Поблагодарили 1218 раз(а) в 765 сообщ.
Сообщение: #43
RE: вызов функции на С
Да как бы все там же, в документации по API KOS Smile
http://gamedev.allusion.net/docs/kos-cur...ic_8h.html

Пример:

PHP код:
static void g1_dma_done_irq(uint32 src) {
    
dbglog(DBG_INFO"g1_dma_done_irq: 0x%08lx\n"src);
}

asic_evt_set_handler(ASIC_EVT_GD_DMAg1_dma_done_irq);
asic_evt_enable(ASIC_EVT_GD_DMAASIC_IRQ_DEFAULT); 

Но что-то я сейчас посмотрел, тебе придется что-то придумать с сисколом gdc_exec_server, так как чтобы твоя команда сработала, нужно дергать этот сискол в цикле и опрашивать состояние.
http://sourceforge.net/p/cadcdev/kallist...drom.c#l99

В принципе проще наверное было бы попробовать на тредах сделать, так как драйвер привода в KOS расчитан на это. Накладные расходы я думаю не должны быть существенными.
Создай отдельный тред для чтения диска и поставь там семафор. Когда нужны будут новые данные, посигналишь семафору и тред отработает свой цикл пока не встанет на семафоре опять (естественно цикл нужно сделать самому).

[Изображение: barbers.png]
19.02.2014 11:58
Вебсайт Найти все сообщения Цитировать это сообщение
Wind Не на форуме
Пользователь
**

Сообщений: 30
Зарегистрирован: 29.08.2013
Рейтинг: 0
Сказал спасибо: 0
Поблагодарили 1 раз(а) в 1 сообщ.
Сообщение: #44
RE: вызов функции на С
По мне проще обойтись без KOS напрямую с железом поработать. В дриме все довольно простенько в этом плане.
20.02.2014 09:29
Найти все сообщения Цитировать это сообщение
SWAT Не на форуме
Администратор
*******

Сообщений: 7245
Зарегистрирован: 04.01.2005
Рейтинг: 30
Сказал спасибо: 149
Поблагодарили 1218 раз(а) в 765 сообщ.
Сообщение: #45
RE: вызов функции на С
Это тебе проще, ты железо знаешь. А ему чем проще то? Он программировать то только учится, а ты его на железо отправляешь Smile

[Изображение: barbers.png]
20.02.2014 13:13
Вебсайт Найти все сообщения Цитировать это сообщение
megavolt85 Не на форуме
Супермодератор
******

Сообщений: 3165
Зарегистрирован: 24.03.2012
Рейтинг: 38
Сказал спасибо: 186
Поблагодарили 1561 раз(а) в 919 сообщ.
Сообщение: #46
RE: вызов функции на С
Что то с тредами у меня не заладилось. Для пробы решил запустить такой код
PHP код:
/* parallelCopy.c */

#include "ds.h"
#include "kos/thread.h"

#define SIZE 4096

typedef struct PART{
    
unsigned long offset;
    
unsigned long size;
}
part_t;

char file[50]; /* source file name */
char fileout[50]; /* target file name */

voidfunc1(void *arg){
    
printf("thread started\n");
    
int finfoutxi;
    
0;
    
part_t *part;
    
char data[SIZE];

    
part = (part_t *)arg;
    if ((
fin fs_open(fileO_RDONLY)) == FILEHND_INVALIDds_printf("Error open file");
    if ((
fout fs_open(fileoutO_WRONLY)) == FILEHND_INVALIDds_printf("Error open file");
    
lseek(finpart->offsetSEEK_SET);
    
lseek(foutpart->offsetSEEK_SET);
        while(
part->size){
                
fs_read(findataSIZE);
                
fs_write(foutdatax);
                
+= x;
        }
        
ds_printf("thread is done.\n");
        
fs_close(fout);
        
fs_close(fin);
        return 
NULL;
}


int main(int argcchar *argv[]){
    
char         data[SIZE];
    
struct stat     f_stat;
    
int         fin1fout1tmpx0;
    
part_t         part1part2part3;
    
kthread_t t1, * t2// two threads to share the load of main thread
    
if (thd_init(THD_MODE_COOP)    != 0ds_printf("Treads alredy initialized.");

    if(
argc 3){
        
ds_printf("Not enough arguments.");
        
ds_printf("parallelCopy sourceFile targetFile");
        return -
1;
    }
    
strcpy(fileargv[1]);
    
stat(file, &f_stat);     // getting the meta info of file
    
strcpy(fileoutargv[2]);

    
ds_printf("Size of file is %lu \n"f_stat.st_size);
    
part1.offset 0;

    
// dividing the size of file in 3 parts
    
part1.size f_stat.st_size 3;
    
part2.offset part1.size;
    
part2.size part1.size;
    
part3.offset part2.offset part2.size;
    
part3.size f_stat.st_size part3.offset;

    
/* creating part1 by main thread */
    
fin1 fs_open(fileO_RDONLY);
    
fout1 fs_open(fileoutO_WRONLY);

    
/*creating 3 threads to copy 2 n 3rd part of file */
    
if ((t1 thd_create(0func1, &part2)) == NULL) { ds_printf("Error create thread 1.");return CMD_ERROR;}
    if ((
t2 thd_create(0func1, &part3)) == NULL) { ds_printf("Error create thread 2.");return CMD_ERROR;}
    while(
part1.size){
        
fs_read(fin1dataSIZE);
        
fs_write(fout1datax);
        
+= x;
    }

if ((
tmp=thd_join(t1NULL)) !=0) { ds_printf("Error join thread 1. code: %d",tmp);return CMD_ERROR;} // making main to wait for t1
if ((tmp=thd_join(t2NULL)) !=0) { ds_printf("Error join thread 2. code: %d",tmp);return CMD_ERROR;} // making main to wait for t2
    
ds_printf("file is copied");
    
fs_close(fout1);
    
fs_close(fin1);
    return 
0;


при сборке получаю ошибку

PHP код:
megavolt@megavolt-GA-790XTA-UD4:~/dreamcast/SDK/examples/commands/parallelCopymake
rm 
-f pcp
/opt/toolchains/dc/sh-elf/bin/sh-elf-gcc --ml -m4-single-only -O2 --Wl,-Ttext=0x00000000 -e _start -nostartfiles -nostdlib -o dbg-pcp parallelCopy.
-L/home/megavolt/dreamcast/kos/lib/dreamcast -L/home/megavolt/dreamcast/kos/addons/lib/dreamcast -L../../../lib -Wl,--start-group  -lds -lkos -lgcc -Wl,--end-group
parallelCopy
.oIn function `main':
/home/megavolt/dreamcast/SDK/examples/commands/parallelCopy/parallelCopy.c:51: undefined reference to 
`_thd_init'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
make: *** [pcp] Ошибка 1 

если в коде убрать if (thd_init(THD_MODE_COOP) != 0) ds_printf("Treads alredy initialized."); , то сборка проходит успешно ,но при запуске в lxdream получаю
PHP код:
D$: pcp /cd/1DS_CORE.BIN /ram/1.bin
Size of file is 1922412
Error join thread 1. code
: -

откуда undefined reference to `_thd_init' ? Какой библиотеки не видит линкер?

HKT-3030, Bios mod, SD mod, VGA internal mod, G1ATA mod, Region changer mod, PSU mod
(Последний раз сообщение было отредактировано 01.03.2014 в 19:18, отредактировал пользователь megavolt85.)
01.03.2014 19:12
Найти все сообщения Цитировать это сообщение
SWAT Не на форуме
Администратор
*******

Сообщений: 7245
Зарегистрирован: 04.01.2005
Рейтинг: 30
Сказал спасибо: 149
Поблагодарили 1218 раз(а) в 765 сообщ.
Сообщение: #47
RE: вызов функции на С
Не нужно тебе вызывать thd_init, она вызывается в самом начале KOS всегда.
Проблема я подозреваю в том, что в RC1, KOS отличается от той, что стоит у тебя. Как раз в этот промежуток времени если мне не изменяет память, были изменения в тредах, функции для них раньше не возвращали никаких значений. В общем чтобы не было конфликтов, тебе надо бы выкачать вот эту ревизию:
http://sourceforge.net/p/cadcdev/kallist...20ae/tree/

Ну и так, на будущее. Не мешай использование разных типов функций. Раз уж ты используешь KOS'овкие функции для файловой системы, то и придерживайся этому везде:
Код:
lseek -> fs_seek
stat -> fs_stat

Хоть и дескрипторы они используют одни и те же, но все же путаницу в коде это создает.
А вообще размер файла можно узнать проще:

PHP код:
size_t size fs_total(fin); 

Ну и не понятно зачем ты такой стресс тест устроил файловой системе. Ты же читаешь и пишешь одни и те же файлы сразу в 3-х местах одновременно.

P.S.
Если есть желание двигаться в этом направлении и дальше (программирование для DS), то могу дать доступ к DEV версии, там кстати есть начатое (и в данный момент отложенное) приложение для рипа.

[Изображение: barbers.png]
(Последний раз сообщение было отредактировано 02.03.2014 в 08:57, отредактировал пользователь SWAT.)
02.03.2014 08:49
Вебсайт Найти все сообщения Цитировать это сообщение
 Сказали спасибо: megavolt85
megavolt85 Не на форуме
Супермодератор
******

Сообщений: 3165
Зарегистрирован: 24.03.2012
Рейтинг: 38
Сказал спасибо: 186
Поблагодарили 1561 раз(а) в 919 сообщ.
Сообщение: #48
RE: вызов функции на С
Цитата:Если есть желание двигаться в этом направлении и дальше (программирование для DS)

С удовольствием подключусь к программированию

P.S. Мда.... увидел свой косяк.... в KOS 1.2 не было thd_join, вместо нее была функция thd_wait

HKT-3030, Bios mod, SD mod, VGA internal mod, G1ATA mod, Region changer mod, PSU mod
(Последний раз сообщение было отредактировано 02.03.2014 в 16:34, отредактировал пользователь megavolt85.)
02.03.2014 14:09
Найти все сообщения Цитировать это сообщение
SWAT Не на форуме
Администратор
*******

Сообщений: 7245
Зарегистрирован: 04.01.2005
Рейтинг: 30
Сказал спасибо: 149
Поблагодарили 1218 раз(а) в 765 сообщ.
Сообщение: #49
RE: вызов функции на С
Смотри личку.

[Изображение: barbers.png]
02.03.2014 19:14
Вебсайт Найти все сообщения Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 2 Гость(ей)