簡體   English   中英

在 contiki os 中對clock_gettime 的未定義引用

[英]undefined reference to clock_gettime in contiki os

我需要在 C 中生成一個隨機數,我使用 srand() 和 rand() 函數做到了。 當我在普通編譯器中運行它時它運行良好,但是當我嘗試在 Contiki OS 中編譯文件時,它拋出了一個“未定義的對clock_gettime的引用”錯誤。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int a;
srand(time(NULL));
a=rand() % 10000 + 2;
char *str = (char*)malloc(a);
int i=0;
for(i=0; i<a-1;i++){
  str[i]='s';
}
str[i] = '\0';
strcat(str,"Hello %d from the client ");
sprintf(buf,str, seq_id);

這是錯誤圖片

有人可以幫我弄這個嗎?

我認為“普通編譯器”是指主機系統的本機編譯器? 在這種情況下,開發主機是帶有操作系統的標准硬件,該操作系統通過最終從 RTC 或 NTP 獲取時間的操作服務提供“掛鍾”時間。

在嵌入式系統中,標准庫是通用的,需要重新定位到您的平台。 通常 I/O、堆管理和時間服務需要重定向。 在這種情況下,你需要定義clock_gettime()來解決鏈接(或者干脆重新定義超越了time() -描述在這里)。 您如何實現它取決於您的特定硬件。 通常,您會從 RTC 獲得時間,但如果您的硬件缺少 RTC 晶振及其備用電池,那么它就沒什么用了。 時間必須來自某個地方,庫無法確定您的特定硬件的位置。

如果您實際上從不需要掛鍾時間並且只是遵循使用time(NULL)作為隨機數生成器種子的常見習慣用法,那么與其完全支持您不需要的time()函數; 考慮使用兩個獨立時鍾源(VLO 和 DCO)生成隨機位序列的替代方法,例如本應用筆記中所述的生成種子的方法。 該方法非常耗時,因此您通常會執行一次,然后通過srand()將其用作標准 PRNG 的種子。

https://github.com/0/msp430-rng/blob/master/rand.c有一個 App Note 算法的實現,但它是作為標准rand()的替代實現的。 我建議您重命名為generate_seed() ,然后調用:

srand( generate_seed() ) ;

我的建議是使用在工廠預編程的 TLV 存儲器中的芯片唯一值。 每個芯片都將包含唯一值(例如校准數據),因此只需散列所有 TLV 內存即可得出種子值,然后將其插入rand()函數中。 如果您手邊沒有散列函數,那么只需對所有字節使用任何 CRC32 計算。

有關如何從 TLV 內存讀取的示例,請參見此代碼 請記住,每個 MSP430 系列都是不同的,因此請查閱器件數據表以了解確切的存儲器位置。

如果您的應用程序初始化每個 MSP430 芯片內的實時時鍾 (RTC) 硬件(並通過電源循環更新它),那么您可以將其添加到散列結果中。 只需使用您的種子值的 RTC 日期和時間寄存器繼續哈希(或 CRC32)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM