我有一个具有一些软实时要求的项目.我有两个进程(我编写的程序)进行一些数据采集.在任何一种情况下,我都需要不断读入正在进入并处理它的数据.
第一个程序是严格的线程,第二个程序使用一个应该是线程的库,但我不知道幕后发生了什么.每个程序都由用户执行,并且(默认情况下)我看到每个程序的优先级为20,漂亮的值为0.每个程序使用大约30%的CPU.
就目前而言,两个进程都必须与一些后台进程争用,我想尽可能地为我的两个程序提供最好的CPU.我的主要问题是我有一个与之交谈的设备,它有一个64字节的硬件缓冲区,如果我没有及时读取它,我会得到溢出.我注意到这种情况每运行2-3小时就会发生一次.
根据我的研究(http://oreilly.com/catalog/linuxkernel/chapter/ch10.html),似乎有三种方法可以优先使用:
将nice值设置为较小的数字,因此为每个进程提供更多优先级.我可以使用nice命令在不对代码进行任何修改(或使用系统调用)的情况下执行此操作.
将sched_setscheduler()用于特定调度策略的整个过程.
使用pthread_setschedparam()分别设置每个pthread.
我遇到了以下障碍:
假设我选择3,如何防止低优先级线程被饿死?是否还有一种方法可以确保共享锁将优先级较低的线程提升到更高的优先级?假设我有一个实时的线程,SCHED_RR并且它与默认的SCHED_OTHER线程共享一个锁.当SCHED_OTHER线程获得锁定时,我希望它执行@更高优先级以释放锁定.我如何确保这一点?
如果SCHED_RR的一个线程创建另一个线程,新线程是自动SCHED_RR,还是我需要指定它?如果我有一个我已设置为SCHED_RR的进程,它的所有线程是否自动遵循此策略怎么办?如果SCHED_RR的进程产生子进程怎么办,它是否太自动SCHED_RR?
鉴于代码仅占用CPU的60%,这是否有任何问题?或者是否仍然存在CPU与后台进程共享的问题,我应该关注并可能导致我的缓冲区溢出?
抱歉这个冗长的问题,但我觉得它需要一些背景信息.在此先感谢您的帮助.
我需要通过双向数据总线(ULPI)与芯片通信.
据我所知,数据在时钟上升沿上在ULPI总线上移出,并在下降时钟边沿读取.我的问题是,当读取寄存器时,我首先需要对上升沿敏感(将命令写入数据总线上的芯片),然后在从芯片读取寄存器输出到总线时下降沿.
我不清楚如何设计这个最好的方法.
我尝试了一个有一个case语句的进程,但为了这个工作,我的进程需要对上升和下降边缘敏感,我认为这不好.或者它确实可以吗?
我将绕圈试图找出如何实现需要由[.c]文件中的多个函数访问的变量.
我一直在使用Stack Exchange和其他谷歌搜索的线程,其中一般[但肯定不是一致的]共识似乎是文件范围的静态变量很好,但是,你应该传递变量(或者至少指针)变量)到功能,不只是有任何旧函数访问静态文件范围变量是在任何函数之外声明(即一个).有些人说文件范围的静态基本上与全局变量一样糟糕,但是如果没有文件范围的静态,则没有说明如何避免全局变量!
但是,在某些时候,即使从函数到函数传递指向文件范围的静态变量的指针,某些函数也必须最初访问该文件范围的静态变量.另外,我看不到一种方法,即.c文件中只有一个函数可以是访问该静态变量的唯一函数,因为并非所有需要静态变量的函数都会通过一个函数.
在我看来,你可以拥有一个除了保存静态变量之外什么都不做的函数,并返回一个指向该静态变量的指针.任何需要访问该变量的函数都会调用该函数,获取指向变量的指针并执行它需要对变量执行的操作.这种事:
struct PacketStruct* GetPacketStructPtr(void)
{
static struct PacketStruct Packet;
return &Packet;
}
Run Code Online (Sandbox Code Playgroud)
我看到有人在这里说,是的,单身工厂是如何建造的(无论是什么),它是完全有效的,但其他人说它很危险(但没有真正解释为什么它是危险的),其他人说这是不好的做法(我认为他们说效率很低,但今天我读得太多了,我可能错了.
那么,我想要确定的是:
文件范围变量可以吗?
如果是这样,假设让所有函数访问该文件范围的静态变量并且不将指针传递给它[静态文件范围的变量]似乎是错误的 - 尽可能使函数重用不同的变量 - 你能决定第一个需要访问文件范围静态的函数吗,然后将指针一直传递给其他函数?我真的很讨厌只访问文件范围的静态变量的代码外观,即使它似乎有点愚蠢地将指针传递给函数可以访问的东西.
如果文件范围的静态变量无效,假设这不是多线程的,只是嵌入式微程序上的run-to-complete程序,可以/我应该使用这种方式将指针传递给函数范围的静态变量到需要访问变量的任何其他函数?
如果不是上述情况,你究竟如何避免可怕的全局变量?这个不使用全局变量的问题在这里似乎已被解决了数十亿次,但没有任何具体的例子说明如何去做.在这里有很多相互矛盾的建议,更不用说在网络的其他部分了!
我强调这是单线程,不是重入,而且都相对简单.
希望这能让我更多地了解我正在尝试做的事情:
#include "work_order.h
// This is work_order.c
// Nothing outside of this file needs to access the WorkOrder struct
static struct WorkOrderStruct WorkOrder;
// Package up a work order - *data is a pointer to a complete serial package
int16_t CableConnectOrder(uint8_t *Data)
{
if (UnpackagePortInformation(&WorkOrder.PortA,&Data) …Run Code Online (Sandbox Code Playgroud) 我继承了一些经过严格混淆和写得不好的PIC代码来修改.这里有两个宏:
#define TopByteInt(v) (*(((unsigned char *)(&v)+1)))
#define BottomByteInt(v) (*((unsigned char *)(&v)))
Run Code Online (Sandbox Code Playgroud)
有人能够解释他们到底做了什么以及这意味着什么?
谢谢 :)
我第一次使用 Lint,它告诉我以下内容:
parameter 'p_h_attr' of function
'get_dev_info_service_id_attr(ble_attribute_t *)' could be const
Run Code Online (Sandbox Code Playgroud)
对于此功能:
static void get_dev_info_service_id_attr(ble_attribute_t *p_h_attr)
{
p_h_attr->p_attr = (void *)ble_char_system_id_value;
p_h_attr->attr_len = sizeof(ble_char_system_id_value);
}
Run Code Online (Sandbox Code Playgroud)
但是,当然,如果我将 p_h_attr 设为 const,编译器会抱怨,因为我正在写入传递给结构的指针。
我该如何解决这个问题?
我刚刚用某些代码帮助了某人.他有这个:
char dataArray[10];
Run Code Online (Sandbox Code Playgroud)
然后想得到一个指向数组开头的指针.而不是使用:
&dataArray[0]
Run Code Online (Sandbox Code Playgroud)
要不就
dataArray
Run Code Online (Sandbox Code Playgroud)
他曾经
&dataArray
Run Code Online (Sandbox Code Playgroud)
他最后用指针指向那里吗?我不确定&dataArray会给他什么.