小编I'm*_*gon的帖子

在编写linux驱动程序时,ERESTARTSYS使用了什么?

我正在学习用于编写linux设备驱动程序的阻塞I/O函数,我想知道它的用法是什么ERESTARTSYS.考虑以下:

全局变量:

wait_queue_head_t my_wait_q_head;
int read_avail = 0;
Run Code Online (Sandbox Code Playgroud)


device_init():

init_waitqueue_head(&my_wait_q_head);


device_read():

printk("I'm inside driver read!\n");
wait_event_interruptible(&my_wait_q_head, read_avail != 0);
printk("I'm awaken!\n");
Run Code Online (Sandbox Code Playgroud)


device_write():

read_avail = 1;
wake_up_interruptible(&my_wait_q_head);
Run Code Online (Sandbox Code Playgroud)


当我调用read()from用户空间时,命令提示符会挂起,直到我write()按预期调用.的printk消息相应地出现,以及在dmesg.但是,我看到一些像这样编写的驱动程序:

另一个版本的device_read():

printk("I'm inside driver read!\n");
if(wait_event_interruptible(&my_wait_q_head, read_avail != 0))    
{return -ERESTARTSYS;}
printk("I'm awaken!\n");
Run Code Online (Sandbox Code Playgroud)

我测试了device_read()在用户空间中使用相同方法的第二个版本,结果完全相同,那么,ERESTARTSYS的用途是什么?

p/s:我已经阅读了这本书上的Linux设备驱动程序,但是我没有得到它,有人可以举例来说明吗?:

一旦我们通过那个电话,有些东西唤醒了我们,但我们不知道是什么.一种可能性是该过程接收到信号.包含wait_event_interruptible调用的if语句将检查此情况.这个陈述确保了对信号的适当和预期的反应,这可能是唤醒过程的原因(因为我们处于可中断的睡眠状态).如果信号已到达并且尚未被进程阻止,则正确的行为是让内核的上层处理事件.为此,驱动程序将-ERESTARTSYS返回给调用者; 此值由虚拟文件系统(VFS)层在内部使用,该层可重新启动系统调用或将-EINTR返回到用户空间.我们使用相同类型的检查来处理每个读写实现的信号处理.

资料来源:http://www.makelinux.net/ldd3/chp-6-sect-2

c linux-device-driver linux-kernel

29
推荐指数
1
解决办法
2万
查看次数

如何使用 MaterialTheme 覆盖 Jetpack Compose 中 TextField 中的文本颜色?

我正在尝试使用TextField()Jetpack Compose。我希望文本颜色为白色。

我发现这有效:

ProvideTextStyle(TextStyle(color = Color.White)) {
   TextField(
       ...
   )
}
Run Code Online (Sandbox Code Playgroud)

但是,我想在主题级别覆盖它,这样我就不需要重复编写ProvideTextStyle. 我看到MaterialTheme只接受以下参数:

@Composable
fun MaterialTheme(
    colors: Colors = MaterialTheme.colors,
    typography: Typography = MaterialTheme.typography,
    shapes: Shapes = MaterialTheme.shapes,
    content: @Composable () -> Unit
)
Run Code Online (Sandbox Code Playgroud)

所以我不知道该怎么做。有人可以帮忙吗?

(撰写版本 = 1.0.0-alpha11)

android android-layout android-jetpack-compose android-compose-textfield android-jetpack-compose-text

27
推荐指数
4
解决办法
3万
查看次数

request_mem_region()实际上做什么以及何时需要它?

我正在研究编写嵌入式Linux驱动程序,并决定开发一些GPIO以确保我正确理解本书(LDD3,第9.4.1节).

我可以按照预期控制正确的GPIO引脚(使其高低,我用万用表探测); 但是,我测试了2个代码,一个有request_mem_region(),一个没有.我期待一个没有失败的人,但两个都工作得很好.

代码request_mem_region:

if( request_mem_region( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF,DEVICE_NAME ) == NULL )
  {
    printk( KERN_ALERT
            "GPIO_140_141_conf_phys error:%s: unable to obtain I/O memory address 0x%08llX\n",
            DEVICE_NAME, PIN3_CONF_PHYS );

    return -EBUSY;
  }

pin3_conf = (u32)ioremap( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin4_conf = (u32)ioremap( PIN4_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin5_conf = (u32)ioremap( PIN5_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin6_conf = (u32)ioremap( PIN6_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
//-----------------------------------------------------------------
if( request_mem_region( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5,DEVICE_NAME ) == NULL )
  {
    printk( KERN_ALERT
            "error:%s: unable to obtain I/O memory address 0x%08llX\n",
            DEVICE_NAME, GPIO_BANK5_PHYS );

    return …
Run Code Online (Sandbox Code Playgroud)

c linux-device-driver linux-kernel embedded-linux

23
推荐指数
2
解决办法
2万
查看次数

如何更改EditText指针颜色(不是光标)

我正在尝试使指针颜色EditText变为蓝色.

Droplet看东西是指针

我能够使下划线和光标变为蓝色,但是液滴外观指针仍然是灰色的.

我有点谷歌,但所有出现的链接只谈论如何更改光标,而不是指针.所以,如果有人知道如何做到这一点,我需要你的帮助.

我只需要支持Android 5.0及更高版本.因此,如果您的解决方案仅适用于API> 21,那就完全没问题了.

谢谢!

android textview android-widget android-layout android-edittext

17
推荐指数
2
解决办法
6326
查看次数

在Linux设备驱动程序编程中使用struct inode和struct文件传递数据的原因

我正在学习Linux设备驱动程序的第3.5章,第3版.本节介绍一种检索我们struct inode *inode在open函数中定义的自定义结构的方法:

int scull_open(struct inode *inode, struct file *filp)
{
    struct scull_dev *dev;

    dev = container_of(inode->i_cdev, struct scull_dev, cdev);
    filp->private_data = dev; /* for other methods */

    }
    return 0;          
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,当设备打开时,struct inode *inode表示设备的传递scull_open.然后,dev提取并传递自定义结构,filp->private_data以便其他方法scull_read可以使用它:

ssize_t scull_read(struct file *filp, char _ _user *buf, size_t count,
                loff_t *f_pos)
{
    struct scull_dev *dev = filp->private_data; 
    /* other codes that uses *dev   */
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很好,直到我意识到我们已经struct scull_dev …

c linux inode linux-device-driver linux-kernel

12
推荐指数
2
解决办法
8090
查看次数

为什么我们需要list_for_each_safe()来删除内核链表中的节点?

我正在学习如何使用list.h中的内核链表API .

我了解到我需要list_for_each_safe()在删除节点时使用list_del()而不是使用list_for_each().

代码list_for_each_safe():

#define list_for_each_safe(pos, n, head) \
    for (pos = (head)->next, n = pos->next; pos != (head); \
        pos = n, n = pos->next)
Run Code Online (Sandbox Code Playgroud)

代码list_for_each():

    for (pos = (head)->next; pos != (head); pos = pos->next)
Run Code Online (Sandbox Code Playgroud)

我注意到它们都非常相似,只是_safe版本需要额外的参数用作"临时存储"(在此声明为list.h).

我知道什么时候应用函数correcly,_safe版本删除,正常版本访问,但我很好奇额外的论点如何使它"安全"?

请考虑以下内容,我将删除链接列表中的每个节点list_for_each_safe():

struct kool_list{
    int to;
    struct list_head list;
    int from;
    };

struct kool_list *tmp;
struct list_head *pos, *q;
struct kool_list mylist; …
Run Code Online (Sandbox Code Playgroud)

c foreach kernel linked-list linux-kernel

12
推荐指数
1
解决办法
1万
查看次数

关于linux设备驱动程序中的register_chrdev_region()的问题

我正在学习使用内核模块的注册register_chrdev_region(dev_t from, unsigned count, const char * name);.

我注意到有或没有这个函数,我的内核模块按预期工作.我用来测试的代码:

first = MKDEV(MAJOR_NUM, MINOR_NUM);
register_chrdev_region(first, count, DEVICE_NAME);//<---with and without

mycdev=cdev_alloc();
mycdev->ops= &fops;
mycdev->owner = THIS_MODULE;

if (cdev_add(mycdev,first, count) == 0)
{printk(KERN_ALERT "driver loaded\n");}
Run Code Online (Sandbox Code Playgroud)

我评论了这一行register_chrdev_region(first, count, DEVICE_NAME);,printk消息仍然出现.我试图在有或没有用户空间的情况下与驱动程序通信,并且两者都是成功的.

所以我的问题是,这个函数register_chrdev_region()是用来让我的驱动程序成为一个好的内核公民,就像告诉其他人"我用完主要数字,请不要使用"?

我试着看一下内核源代码char_dev.c来理解这个函数,但是我发现它太难理解了,有人熟悉这个吗?

谢谢!

c linux-device-driver linux-kernel

9
推荐指数
1
解决办法
7869
查看次数

为什么gitk没有显示我的本地分支?

我正在学习git并正在使用gitk可视化我的历史和分支.

我尝试gitk了一个本地初始化的repo,它能够显示我正确制作的两个分支.

但是,当我尝试启动gitk以使用获得的repo进行可视化时git clone,gitk仅显示其中一个分支.


这是发生的事情:

在我做了之后git clone,我可以在本地看到1个分支:

$ git branch
* experiment
Run Code Online (Sandbox Code Playgroud)

所以我git checkout -b master origin/master现在创建了我的本地跟踪分支:

$ git branch
  experiment
* master
Run Code Online (Sandbox Code Playgroud)

现在我以为我有2个本地分支,所以我很乐意启动gitk,但是,我只能看到一个分支:

gitk没有显示本地分支

我知道通过以下方式查看隐藏master分支的方法gitk --all:

当与--all一起使用时,gitk只显示其他本地分支

但现在我真的好奇为什么gitk不展示master我在这里的当地分公司,有没有人有任何想法?

谢谢!

git gitk

8
推荐指数
1
解决办法
2728
查看次数

耙资产:预编译

C:\Sites\dtr-payroll>rake assets:precompile
rake aborted!
You have already activated rake 10.0.4, but your Gemfile requires rake 10.0.3. Using bundle exec may solve this.
C:/Sites/dtr-payroll/config/boot.rb:6:in `<top (required)>'
C:/Sites/dtr-payroll/config/application.rb:1:in `<top (required)>'
C:/Sites/dtr-payroll/Rakefile:5:in `<top (required)>'
(See full trace by running task with --trace)
Run Code Online (Sandbox Code Playgroud)

mysql windows postgresql ruby-on-rails phpmyadmin

7
推荐指数
2
解决办法
3219
查看次数

Google Analytic广告系列跟踪未在报告中显示

我正在尝试在Android中实施Google Analytic广告系列跟踪.我按照本指南操作:https://developers.google.com/analytics/devguides/collection/android/v2/campaigns

这就是我所做的:

将此添加到AndroidManifest:

<!-- Used for install referral measurement-->
<service android:name="com.google.analytics.tracking.android.CampaignTrackingService"/>
<receiver android:name="com.google.analytics.tracking.android.CampaignTrackingReceiver" android:exported="true">
  <intent-filter>
    <action android:name="com.android.vending.INSTALL_REFERRER" />
  </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

按照本指南(https://developers.google.com/analytics/solutions/testing-play-campaigns)执行广播:

adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -n com.my.app/com.google.analytics.tracking.android.CampaignTrackingReceiver --es  "referrer" "utm_source%3Dtest_source%26utm_medium%3Dtest_medium%26utm_term%3Dtest_term%26utm_content%3Dtest_content%26utm_campaign%3Dtest_name"
Run Code Online (Sandbox Code Playgroud)

我检查了logcat,它正确地显示了这一行:

02-12 11:47:13.190: I/GAV3(18963): Thread[GAThread,5,main]: Campaign found: utm_source%3Dtest_source%26utm_medium%3Dtest_medium%26utm_term%3Dtest_term%26utm_content%3Dtest_content%26utm_campaign%3Dtest_name
Run Code Online (Sandbox Code Playgroud)

但是,它还有另外两条线:

02-12 11:47:18.280: W/System.err(18963): [DEBUG] GbaRequest - GbaRequest: Constructor Called 222 userAgent Apache-HttpClient/UNAVAILABLE (java 1.4)
02-12 11:47:18.280: W/System.err(18963): [DEBUG] NafRequest - NafRequest: NafRequest constructor===useragent Apache-HttpClient/UNAVAILABLE (java 1.4) 
Run Code Online (Sandbox Code Playgroud)

我检查了GA报告页面取得下- >谷歌播放- >源,它的只显示(未设置),(无)或(直接),但不是source,medium等我期待看到: …

android google-analytics

7
推荐指数
1
解决办法
944
查看次数