「再入国」の問題を回避する体系的な方法はありますか? (組み込みシステム)[閉じた
-
22-09-2019 - |
質問
Cを使用してARMコアにシステムを構築しています(つまり、組み込みシステム)。問題は、すべての再入国バグが削除されると確信するように、正式な方法で再突入の問題を回避するにはどうすればよいですか。これは実用的な願いではないかもしれませんが、どのシステムにとっても確かに重要だと思います。
議論のためだけに、UML図を描くか、完全な状態マシンを持っていることは良いスタートになると思います(ただし、システム全体が開発された後にそれを生成する方法は?)。 State Machine / UML図を使用して分析を行う方法に関する提案はありますか?
解決
@Arexanderによって言及されているように、WebPartはまだWebPartギャラリーに残ります。WebPartギャラリーのWebPartを探してそこからそれを削除するための特徴考えられるイベントにコードを書く必要があります。次のことは、イベントで書かれる必要があるサンプルコードです。
int itemToDelete = 0;
SPList list = parentSite.GetCatalog(SPListTemplateType.WebPartCatalog);
foreach (SPListItem item in list.Items)
{
if (item["Web Part"].ToString().ToLower() == "name.webpart")
{
itemToDelete = item.ID;
break;
}
}
if (itemToDelete > 0)
{
SPListItem item = list.GetItemById(itemToDelete);
item.Delete();
}
list.Update();
. 他のヒント
あなたが何かを疑うなら、クイック修正:
int some_func(int x, int y)
{
static volatile int do_not_enter_twice = 0;
assert(!(do_not_enter_twice++));
/* some_func continued */
do_not_enter_twice--;
return whatever;
}
より長い答え:
いくつかのツールを使用してaを作成します グラフを呼び出します そこから手動で続けます。
計算できるツール 巨大 コールグラフはです DMSソフトウェアリエンジニアリングツールキット およびそのcフロントエンド。 Cフロントエンドは、Cコードを解析するために使用されます。 DMSには、制御およびデータフロー分析、ポイントツー分析、およびコールダイレクトとコールインディレクトスルーポインターの事実を計算するための機械が組み込まれています
DMSは、cソースコードシステムのコールグラフを構築するために使用されています 3500万 Cコードの行(= 250,000関数)、そしてそのコールグラフから情報を抽出します。このような大きなグラフを構築する際の重要な問題は、ポイントツー情報を実用的に正確に計算することです(これを完全に行うことには強い理論の制限があります)。
あなたの場合、抽出する情報は、他の著者が示すように、「サイクルはありますか?」です。このコールグラフで。
この規模では、これを手作業でやりたくないので、制作ビルドの準備をするたびにやり直す必要があります。したがって、チェックを機械化することは非常に理にかなっています。
これはあなたがあなたのサンプルデータに求める出力を生成します。
Option Explicit
Sub GenerateCalendar()
Dim DateCrnt As Date
Dim DayOfWeekCrnt As Long
Dim HoursToPlace As Long
Dim RowDestCrnt As Long
Dim RowSrcCrnt As Long
Dim RowSrcLast As Long
Dim SrcWork() As Variant
' Assume source data starts in row 2 of columns A and B of Worksheet Calendar 1
With Worksheets("Calendar 1")
' Find last used row in column A
RowSrcLast = .Cells(Rows.Count, "A").End(xlUp).Row
SrcWork = .Range(.Cells(2, "A"), .Cells(RowSrcLast, "B")).Value
End With
' SrcWork is now a 2D array containing the data from Calendar1.
' Dimension 1 holds the rows. Dimension 2 holds to columns.
' Initialise control variable for SrcWork
RowSrcCrnt = 1
DateCrnt = SrcWork(RowSrcCrnt, 1)
HoursToPlace = SrcWork(RowSrcCrnt, 2)
RowSrcCrnt = 2
' Assume output data is to be placed in in Worksheet Calendar 2 in columns
' A and B starting at row 2
RowDestCrnt = 2
With Worksheets("Calendar 2")
Do While True
' DateCrnt identifies the next date to output.
' HoursToPlace identifies the unplaced hours
With .Cells(RowDestCrnt, 1)
.Value = DateCrnt
.NumberFormat = "ddd d mmm yyy"
End With
If HoursToPlace > 8 Then
.Cells(RowDestCrnt, 2).Value = 8
HoursToPlace = HoursToPlace - 8
Else
.Cells(RowDestCrnt, 2).Value = HoursToPlace
HoursToPlace = 0
End If
RowDestCrnt = RowDestCrnt + 1
If HoursToPlace = 0 Then
' No more hours to place from last row of SrcWork
If RowSrcCrnt > UBound(SrcWork, 1) Then
' There are no used rows in SrcWork. Finished
Exit Do
End If
' Extract next row from source data.
DateCrnt = SrcWork(RowSrcCrnt, 1)
HoursToPlace = SrcWork(RowSrcCrnt, 2)
RowSrcCrnt = RowSrcCrnt + 1
Else
' More hours to place. Set DateCrnt to the next weekday.
Do While True
DateCrnt = DateAdd("d", 1, DateCrnt) ' Add 1 day to DateCrnt
DayOfWeekCrnt = Weekday(DateCrnt)
If DayOfWeekCrnt >= vbMonday And DayOfWeekCrnt <= vbFriday Then
' Have week day
Exit Do
End If
Loop
End If
Loop
End With
End Sub
.