我是否有可能以一种允许我确定"9"是排序列表中第一个缺失值而不使用for循环并将每个值与其相邻的值进行比较的方式使用LINQ?
var listStringVals = new [] { "7", "13", "8", "12", "10", "11", "14" };
// sort list to "7","8","10","11","12","13","14"
var sortedList = listStringVals.OrderBy(c => int.Parse(c)).ToList();
// need some magic here to get the first gap in the sorted list
Run Code Online (Sandbox Code Playgroud) 我想知道嵌入式领域的开发人员是否知道任何有趣的技巧来帮助减轻堆栈空间非常有限的微控制器开发的痛苦.我最近为8位UC(Microchip PIC18F系列,31字节堆栈)编写了一些固件,因此我不得不压缩程序并减少传递给函数的参数数量.我也试图最小化我对较大局部变量的依赖.扁平化旨在将更少的东西放在堆栈上,减少局部变量有助于节省RAM中"自动变量"程序部分(psect)中的空间.我知道,哈佛建筑并不好玩,但这正是我正在处理的问题.我注意到从ISR深入调用多个函数的问题,这可能是我的堆栈窗口受IRQ上下文保存影响的结果.我知道我正在使用限制性架构,但我想知道是否有人有任何减少头痛的技巧.我尽可能使用指针和边界检查,但我确信有一些我没有发现自己的智慧.作为免责声明,我目前正在使用函数指针来促进状态机.我觉得我正在走90线虚空函数和实际使用函数的代码之间走钢丝.m目前正在使用函数指针来方便状态机.我觉得我正在走90线虚空函数和实际使用函数的代码之间走钢丝.m目前正在使用函数指针来方便状态机.我觉得我正在走90线虚空函数和实际使用函数的代码之间走钢丝.
我应该如何编写代码来示例恰好是结构成员的数组的特定数组索引?以下代码给了我一些问题.
// main.c
void clean_buffers(void); // prototype
struct DEV_STATUS {
unsigned char ADDR;
unsigned char DEV_HAS_DATA;
unsigned char ETH_HAS_DATA;
unsigned char DATA[20];
};
struct DEV_STATUS g_cmdQueue[60] = {0};
void main(void) {
clean_buffers();
while (1) {
;// MCU tasks
}
}
void clean_buffers(void) {
unsigned char theCount = 0;
byte queIdx;
for (queIdx = 0; queIdx < 59; queIdx++) {
struct DEV_STATUS *p_struct;
unsigned char *p_data;
p_struct = &g_cmdQueue[queIdx];
p_data = &p_struct->DATA;
p_struct->ADDR = 0;
p_struct->DEV_HAS_DATA = 0;
p_struct->ETH_HAS_DATA = 0; …Run Code Online (Sandbox Code Playgroud) 预算PIC的有限堆栈大小是一个问题区域,我已调整我的代码以适应这一现实.我目前采用粗略的范例,将密切相关的函数分组到一个模块中,并在模块中声明所有变量全局静态(以减少存储在auto psect中的变量数量,并且可变性问题仅与ISR相关,我考虑.)我不这样做是因为这是一种很好的做法,但实际情况是你有足够的空间来分配整个项目中存在的所有本地函数变量.在8/16位芯片的嵌入式世界中,这是一种合适的方法,只要我确保采取必要的预防措施吗?我也为以太网分配> 256字节的RAM(我知道它应该是1500作为标准MTU,但我们有一个自定义的情况和非常有限的RAM缓冲区,并且必须通过指针访问该内存,所以我可以避免内存银行的语义.我做错了吗?我的应用程序有效,但我100%愿意接受改进建议.[C]
char byte_to_ascii(char value_to_convert, volatile char *converted_value) {
if (value_to_convert < 10) {
return (value_to_convert + 48);
} else {
char a = value_to_convert / 10;
double x = fmod((double)value_to_convert, 10.0);
char b = (char)x;
a = a + 48;
b = b + 48;
*converted_value = a;
*(converted_value+1) = b;
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
此函数的目的是获取0到99的unsigned char值,并返回它在0-9的情况下的ascii等效值,或者操作一个小的全局字符数组,该数组可以在函数完成后从调用代码引用.
我问这个问题是因为同一供应商的两个编译器以不同的方式解释这个代码.
编写此代码是为了将通过RS485发送的地址字节解析为可以轻松传递给send-lcd-string函数的字符串.
该代码是为PIC18架构(8位uC)编写的.
问题是特定编译器的免费/评估版本生成了完美的汇编代码,但在遭受性能损失的情况下工作,但是付费且假设优越的编译器能够更高效地生成代码,代价是能够引用我所有字节数组的地址用于驱动我的液晶显示器上的图形.
我知道我通过使用专有的编译器为一个不太典型的架构在水中放了很多泥,但我希望那里的人有一些建议.
谢谢.
我正在为分布式系统中的串行通信编写一个简单的多点RS485协议.我正在使用一个可寻址的模型,其中从设备被给予一个20ms的窗口来响应.主uC轮询连接的设备以进行更新,并相应地做出响应.我使用了校验和并采取必要的超限预防措施,以确保连接的设备不会响应格式错误的消息.事实证明,这种方法在大约99%的情况下都有效,但如果在通信会话期间引入了新设备,则会丢失数据包.插入新设备"热"将对从设备监控的信号产生负面影响,如果只是在极短的时间内.我是工程的软件方面,但是如何在不尝试重新创建TCP的情况下缓解这种情况呢?我们使用轮询模型,因为它很快并且对我们的应用程序来说工作得很好,不需要RTOS功能.我在每个cpu上有很多周期,用基本术语来思考.
我试图使用Powershell使用cli编译器/链接器自动化项目的构建.我想将脚本放在项目的根目录中,让它以递归方式检查所有源文件并编译它们,编译器输出指向与源文件相同的目录.我还想收集一个*.c列表作为逗号分隔的变量作为链接器的输入.这是典型的情况:
//projects/build_script.ps
//projects/proj_a/ (contains a bunch of source files)
//projects/proj_b/ (contains a bunch of source files)
Run Code Online (Sandbox Code Playgroud)
我希望扫描所有子目录并编译每个*.c文件的源代码.这是我到目前为止:
$compilerLocation = "C:\Program Files (x86)\HI-TECH Software\PICC-18\PRO\9.63\bin\picc18.exe";
$args = "--runtime=default,+clear,+init,-keep";
$Dir = get-childitem C:\projects -recurse
$List = $Dir | where {$_.extension -eq ".c"}
$List | $compilerLocation + "-pass" + $_ + $args + "-output=" + $_.current-directory;
Run Code Online (Sandbox Code Playgroud)
我意识到$ _.current-directory不是真正的成员,我可能还有其他语法问题.我为我的问题含糊不清道歉,我更愿意进一步解释一些看似不清楚的问题.
我目前正在尝试将一系列批处理文件转换为PowerShell脚本.我想以递归方式为目录中存在的源文件运行编译器.编译器需要一长串参数.问题是,我希望参数是可变的,所以我可以根据需要更改它们.这是批处理文件中的典型调用(为了可读性和长度而简化):
"C:\ PICC编译器\ picc18.exe"--pass1"C:\ Src Files\somefile.c"" - IC:\ Include Files"" - IC:\ Header Files"-P --runtime = default,+ clear,+ init,-keep,+ download,+ stackwarn,-config,+ clib,-plib --opt = default,+ asm,-speed,+ space,9 --warn = 0 --debugger = realice -Blarge --double = 24 --cp = 16 -g --asmlist" - errformat = Error [%n]%f;%l.%c%s"" - msgformat = Advisory [%n]%s" - -OBJDIR ="C:\ Built Files"" - warnformat = Warning [%n]%f;%l.%c%s"
当包含在批处理文件中时,此命令执行正常,但是当我将命令复制并粘贴到PowerShell中时,我开始收到错误.这只是我第二天使用PowerShell,但我过去使用.NET开发.我设法凑合了以下尝试:
$srcFiles = Get-ChildItem . -Recurse -Include "*.c"
$srcFiles | % {
$argList = "--pass1 " + $_.FullName; …Run Code Online (Sandbox Code Playgroud) 我想用LINQ来解决以下问题,我有以下集合:
List<byte> byteList = new List<byte() { 0x01, 0x00, 0x01, 0x02, 0x01, 0x00, 0x3, 0x4, 0x02 };
Run Code Online (Sandbox Code Playgroud)
此示例中的数据遵循以下模式:
byteList [0] =地址(1,2,3,... n)
byteList [1] =旧状态,基本上代表枚举
byteList [2] =新状态,与上面相同
我正在与嵌入式设备连接,这就是我可以查看输入变化的方式.
为了清理代码并使维护程序员更容易遵循我的逻辑,我想抽象出所涉及的一些细节,并将每个三字节数据集提取为一个匿名类型,以便在其中使用执行一些额外处理的功能.我写了一个快速实现,但我相信它可以大大简化.我正在努力清理代码,而不是泥泞的水域!必须有一种更简单的方法来执行以下操作:
List<byte> byteList = new List<byte>()
{
0x01, 0x09, 0x01, 0x02, 0x08, 0x02, 0x03, 0x07, 0x03
};
var addresses = byteList
.Where((b, i) => i % 3 == 0)
.ToList();
var oldValues = byteList
.Where((b, i) => i % 3 == 1)
.ToList();
var newValues = byteList
.Where((b, i) => i …Run Code Online (Sandbox Code Playgroud) 我想为使用基类作为类型要求的对象集合编写扩展方法.我知道这不一定是做事的最佳方式,但我很好奇,因为我有兴趣学习语言的细微差别.这个例子解释了我想做什么.
public class Human { public bool IsHappy { get; set; } }
public class Man : Human { public bool IsSurly { get; set; } }
public class Woman : Human { public bool IsAgreeable { get; set; } }
public static class ExtMethods
{
public static void HappinessStatus(this IEnumerable<Human> items)
{
foreach (Human item in items)
{
Console.WriteLine(item.IsHappy.ToString());
}
}
}
// then in some method, I wish to be able to do the following
List<Woman> females = …Run Code Online (Sandbox Code Playgroud) c ×5
.net ×3
c# ×3
embedded ×3
pointers ×3
batch-file ×2
linq ×2
powershell ×2
.net-3.5 ×1
c#-3.0 ×1
collections ×1
dereference ×1
inheritance ×1
irq ×1
member ×1
memory ×1
oop ×1
rs485 ×1
sorting ×1
stack ×1
structure ×1