我正在编写一个用于模拟分布式传感器群的python平台.这个想法是最终用户可以编写一个由SensorNode行为(通信,日志记录等)组成的自定义节点,以及实现许多不同的传感器.
下面的例子简要说明了这个概念.
#prewritten
class Sensor(object):
def __init__(self):
print "Hello from Sensor"
#...
#prewritten
class PositionSensor(Sensor):
def __init__(self):
print "Hello from Position"
Sensor.__init__(self)
#...
#prewritten
class BearingSensor(Sensor):
def __init__(self):
print "Hello from Bearing"
Sensor.__init__(self)
#...
#prewritten
class SensorNode(object):
def __init__(self):
print "Hello from SensorNode"
#...
#USER WRITTEN
class MySensorNode(SensorNode,BearingSensor,PositionSensor):
def CustomMethod(self):
LogData={'Position':position(), 'Bearing':bearing()} #position() from PositionSensor, bearing() from BearingSensor
Log(LogData) #Log() from SensorNode
Run Code Online (Sandbox Code Playgroud)
首先概述我想要实现的目标:我正在编写一个模拟器来模拟群体智能算法,特别关注移动传感器网络.这些网络由许多小型机器人组成,这些小型机器人传递单个传感器数据以构建复杂的环境感官图.
该项目的基本目标是开发一个模拟平台,为传感器提供抽象接口,使得相同的用户实现功能可以直接移植到运行嵌入式Linux的机器人群中.由于机器人实现是目标,我需要设计软件节点的行为相同,并且只能访问物理节点可能具有的信息.
作为模拟引擎的一部分,我将提供一组建模不同类型传感器和不同类型传感器节点的类.我希望从用户那里抽象出所有这些复杂性,以便所有用户必须做的是定义节点上存在哪些传感器,以及实现什么类型的传感器节点(移动,固定位置).
我最初的想法是每个传感器都会提供一个read()方法,它会返回相关的值,但是在阅读了问题的答案之后,我看到也许更具描述性的方法名称会有所帮助(.distance(),. position( ),. bearing()等).
我最初想要为传感器使用单独的类(具有共同的祖先),以便更技术的用户可以轻松地扩展其中一个现有类,以便在需要时创建新的传感器.例如:
Sensor
|
DistanceSensor(designed for 360 degree scan range)
| …
Run Code Online (Sandbox Code Playgroud) 在erlang中,有一些按位操作来操作整数,例如:
1> 127 bsl 1.
254
Run Code Online (Sandbox Code Playgroud)
还可以将整数打包成一个字节序列
<< 16#7F, 16#FF >>
Run Code Online (Sandbox Code Playgroud)
是否有可能,或者是否有任何运算符或BIF可以对二进制打包数据执行按位运算(例如AND,OR,XOR,SHL,SHR)?
例如(如果bsl在二进制包上工作 - 它没有):
1> << 16#7F, 16#FF >> bsl 1.
<< 255, 254 >>
Run Code Online (Sandbox Code Playgroud) 是否有可能编译包含非内核包含的功能的linux内核(2.6)模块?
例如:
kernelmodule.h
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h> // printk()
// ...
#include <openssl/sha.h>
// ...
Run Code Online (Sandbox Code Playgroud)
Makefile文件
obj-m := kernelmodule.o
all:
$(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules
clean:
$(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean
$(RM) Module.markers modules.order
Run Code Online (Sandbox Code Playgroud)
我编写并尝试编译的内核模块包含许多openssl包含文件中的功能.
上面提到的标准makefile不允许包含在linux头文件之外.是否可以包含此功能,如果可以,请指出我正确的方向.
谢谢,迈克
Archaelus在这篇文章中建议写一个新的格式例程来处理命名参数可能是一个很好的学习练习.因此,本着学习语言的精神,我编写了一个处理命名参数的格式化例程.
一个例子:
1> fout:format("hello ~s{name}, ~p{one}, ~p{two}, ~p{three}~n",[{one,1},{three,3},{name,"Mike"},{two,2}]).
hello Mike, 1, 2, 3
ok
Run Code Online (Sandbox Code Playgroud)
基准:
1> timer:tc(fout,benchmark_format_overhead,["hello ~s{name}, ~p{one}, ~p{two}, ~p{three}~n",[{one,1},{name,"Mike"},{three,3},{two,2}],100000]).
{421000,true}
= 4.21us per call
Run Code Online (Sandbox Code Playgroud)
虽然我怀疑这个开销大部分是由于循环,但是调用带有一个循环的函数会产生<1us的响应.
1> timer:tc(fout,benchmark_format_overhead,["hello ~s{name}, ~p{one}, ~p{two}, ~p{three}~n",[{one,1},{name,"Mike"},{three,3},{two,2}],1]).
{1,true}
Run Code Online (Sandbox Code Playgroud)
如果有更好的方法在erlang中进行基准测试,请告诉我.
守则:(
根据道格的建议修订)
-module(fout).
-export([format/2,benchmark_format_overhead/3]).
benchmark_format_overhead(_,_,0)->
true;
benchmark_format_overhead(OString,OList,Loops) ->
{FString,FNames}=parse_string(OString,ONames),
benchmark_format_overhead(OString,OList,Loops-1).
format(OString,ONames) ->
{FString,FNames}=parse_string(OString,ONames),
io:format(FString,FNames).
parse_string(FormatString,Names) ->
{F,N}=parse_format(FormatString),
{F,substitute_names(N,Names)}.
parse_format(FS) ->
parse_format(FS,"",[],"").
parse_format("",FormatString,ParamList,"")->
{lists:reverse(FormatString),lists:reverse(ParamList)};
parse_format([${|FS],FormatString,ParamList,"")->
parse_name(FS,FormatString,ParamList,"");
parse_format([$}|_FS],FormatString,_,_) ->
throw({'unmatched } found',lists:reverse(FormatString)});
parse_format([C|FS],FormatString,ParamList,"") ->
parse_format(FS,[C|FormatString],ParamList,"").
parse_name([$}|FS],FormatString,ParamList,ParamName) ->
parse_format(FS,FormatString,[list_to_atom(lists:reverse(ParamName))|ParamList],"");
parse_name([${|_FS],FormatString,_,_) ->
throw({'additional { found',lists:reverse(FormatString)});
parse_name([C|FS],FormatString,ParamList,ParamName) -> …
Run Code Online (Sandbox Code Playgroud) 我有一个问题,我相信通过功能编程风格可以最好地解决这个问题.
来自一个非常迫切的背景,我习惯于程序设计涉及类图/描述,通信图,状态图等.然而,这些图,所有暗示,或用于描述系统的状态和各种副作用,行动对系统有影响.
在功能程序的设计中是否使用了任何标准化的图表或数学符号集,或者这些程序是在短函数伪代码中最佳设计的(假设函数将比命令式对应函数短得多).
谢谢,迈克
我正在尝试开发一个firefox扩展,它将额外的HTTP头字段插入到传出的HTTP请求中(与我同时开发的apache扩展接口).
虽然我理解扩展的各个组件并理解Web上提供的基本教程,但我发现很难从"Hello World"教程扩展到开发一个完整的扩展.
我想要为我的目的调整的示例代码显示在设置HTTP请求标头的底部.
我想知道,在扩展层次结构中应放置此代码的位置以及如何调用/构造/激活此代码,它是否会在扩展初始化时自动运行?
提前致谢.
我正在尝试实现一个firefox扩展,它会过滤传入的HTTP响应并相应地处理它们.
我希望阻止包含特定标头的HTTP响应.阅读了一些MDC文章后,观察HTTP响应的最常见方式似乎是注册一个http-on-examine-response观察者.
我的问题是:使用这个观察者,是否可以阻止HTTP请求进一步处理(作为副产品,页面将继续等待响应)?或者我是否需要使用XPCOM的其他方面(如果是这样,请注意指向正确的方向)?
先谢谢你,
迈克
我写了一些我希望移植到python的C代码,因为我觉得python是一种更好的"概念"语言.
在我的C代码中,我使用内存重新解释来实现我的目标,例如:
sizeof(int) is 4 byte
sizeof(char) is 1 byte
char c[4]={0x01,0x30,0x00,0x80};
int* i=(int*)c;
*i has the value 0x80003001
Run Code Online (Sandbox Code Playgroud)
同样,如果我有:
int* j = (int*)malloc(sizeof(int));
char* c = (char*)j;
*j = 0x78FF00AA;
c is now {0xAA, 0x00, 0xFF, 0x78}
Run Code Online (Sandbox Code Playgroud)
我想在python中做类似的事情,我意识到我可以使用位操作来完成这个:
chararray=[]
num=1234567890
size=8
while len(chararray) < size:
char = chr( (num & 255 ) )
num = num >> 8
chararray.append(char)
Run Code Online (Sandbox Code Playgroud)
但是我希望有更快的方法来实现这一目标.
python有没有类似于C的联合?
问题:
链接静态库时生成的固件映像与链接直接从静态库中提取的对象时生成的固件映像不同.
两个固件映像都没有错误地链接并成功加载到微控制器上.
后一个二进制文件(与对象链接)成功执行并按预期执行,而前者(链接到静态库)则不然.
编译期间唯一的警告是unused-but-set-variable
在制造商提供的HAL中,由于编译实现不需要各种宏定义; 并且unused-parameter
在各种弱功能中,也在制造商提供的HAL内.
描述:
我正在为STM32F407开发一个嵌入式应用程序.到目前为止,我一直在使用一个代码库,包括微处理器的HAL和设置代码,特定外设的驱动程序以及利用前两者的应用程序.
由于我希望使用相同的驱动程序和HAL开发多个应用程序(两者都是完整的和经过测试的,因此不会经常更改),我希望编译和分发HAL和驱动程序作为静态库,然后可以将其与申请来源.
问题是当链接应用程序和静态库时,固件映像无法在微处理器上正确执行.链接应用程序和直接从静态库中提取的目标文件时,固件映像按预期执行.
特别:
使用以下方法链接静态库时,创建的二进制文件不起作用:
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(APPOBJECTS) Library/libtest.a
Run Code Online (Sandbox Code Playgroud)
使用以下方法链接从静态库中提取的对象时创建的二进制文件
@cd Library && $(AR) x libtest.a && cd ..
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(APPOBJECTS) Library/*.o
Run Code Online (Sandbox Code Playgroud)
在这两种情况下:
CFLAGS = $(INCLUDES) $(DEFS) -ggdb3 -O0 -std=c99 -Wall -specs=nano.specs -nodefaultlibs
CFLAGS+= -fdata-sections -ffunction-sections -mcpu=cortex-m4 -march=armv7e-m -mthumb
CFLAGS+= -mfloat-abi=hard -mfpu=fpv4-sp-d16 -MD -MP -MF $@.d
LDFLAGS = -T$(LDSCRIPT) -Wl,-static -Wl,-Map=$(@:.elf=.map),--cref -Wl,--gc-sections
Run Code Online (Sandbox Code Playgroud)
我已经比较了输出-Wl,--print-gc-sections
以及app.map
文件,但是在两个版本之间有足够的不同,没有任何东西跳出来是错误的.我也试过没有-Wl,--gc-sections
,无济于事.
arm-none-eabi-size
两个固件映像的输出是:
text …
Run Code Online (Sandbox Code Playgroud)