我查看了 SPIN 模型检查器。但是,它没有动态分配的功能。是否有任何其他模型检查器可用于动态分配?
问问题
143 次
1 回答
0
您可以通过多种方式实现动态分配。在所有这些中,您需要对分配数量设置上限(这通常不是限制因素)。
您将为要分配的内容定义结构类型,并将其中的一些放入数组中。您将使用该数组的索引来引用该结构。所以,有点像这样:
#define data_t byte
typedef data_record {
data_t me;
bool allocated;
// .... your data fields here ....
}
#define NUMBER_OF_DATA_RECORDS 10
data_record data_record_array[NUMBER_OF_DATA_RECORDS];
#define DATA_RECORD_ALLOCATED(dt) data_record_array[(dt)].allocated
#define DATA_RECORD_ME(dt) data_record_array[(dt)].me
现在您可以定义一些inlines
来分配和释放这些。有多种选择。例如,要分配,只需遍历data_record_array
以找到data_record
不是的allocated
。有点像这样:
// Assigns data_ptr with a free data_record index
inline data_record_allocate (data_t data_ptr)
{
data_ptr = 0;
do
:: data_itr >= NUMBER_OF_DATA_RECORDS -> break
:: else ->
if
:: ! DATA_RECORD_ALLOCATED (data_itr) ->
DATA_RECORD_ALLOCATED (data_itr) = true
DATA_RECORD_ME (data_itr) = data_it
break
:: else -> data_itr++
fi
od
}
然后免费就像:
inline data_record_free (data_t data_ptr)
{
DATA_RECORD_ALLOCATED (data_itr) = false
data_itr = NUMBER_OF_DATA_RECORDS
}
更复杂一点的是将所有自由索引(一开始是所有索引)放入“自由索引”通道中。当您分配时,只需从通道中读取;当您空闲时,只需推回频道。
于 2014-11-26T04:06:38.010 回答