Tina3.5.1中自带的UI是 minigui ,这东西比较老,相应的资料也少。
现在我遇到一个问题:
怎么在minigui的应用程序框架中添加自己的线程?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
程序中同时使用了 wav播放库 和 modbus库。
wav不用说,如果一定时间内没有给驱动程序送数据流,他就会卡住,表现是声音断断续续。
实测在tinyplay库中:
pcm_writei(ctx.pcm, music_buffer, frame_count) 该函数,如果没有即时调用就会卡顿。
函数内部最终实现的接口是:
ioctl(pcm->fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, &x)
也就是说 pcm_writei 如果没有及时被执行,则 pcm_writei 会阻塞大约512ms(平时根据设置缓存的大小 几十到100多ms) . 这段时间按个人理解是 重新启动初始化了 pcm设备。
而modbus干脆在读取设备时,干脆就是一个阻塞函数...等待目标地址的设备回应 如果超出规定时间 则放弃该次通讯,报告错误。
仅仅读一个线圈寄存器 我都需要为他花费至少40ms的时间。9600波特率 传输1个字节 大约不到1ms ,来回的报文大概都用掉了 10多MS。
我现在的问题就是 这两者无法 合理的分配时间。。。如果在播放过程中穿插modbus指令,声音就会时不时卡顿。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我试着用一个进程来 单独完成播放wav的工作 在程序中添加
void *thread_fun(void *arg)
{
pthread_t tid;
while(1)
{
tid = pthread_self();
printf("hello %u~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n",(unsigned int)tid);
sleep(500);
}
}
并在int MiniGUIMain(int argc, const char *argv[])函数最开始的地方添加 :pthread_create(&id,NULL,thread_fun,NULL);
结果是没什么鸟用....仅仅在应用启动时 输出一条 printf("hello %u~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n",(unsigned int)tid);
后面就毫无动静了。。。minigui正常工作。但是不会一直重复打印内容。
大佬们,有什么高招吗?
最近编辑记录 gaocangjian (2022-09-19 12:40:20)
离线
解决了.....我的天...
sleep居然所s级延迟.... 跟windows不一样.
改成usleep就可以了 这玩意是微妙级的
离线