本文目录一览

1,1点20分时 时钟的时针与分针的夹角是多少度2点15分时 时钟的时针

1点20分时 时钟的时针与分针的夹角是80度,2点15分时 时钟的时针与分针的夹角是22.5度
50

1点20分时 时钟的时针与分针的夹角是多少度2点15分时 时钟的时针

2,freertos任务切换需要多少个时钟周期

周期1ms,每当任务、队列和信号量创建的时候,FreeRTOS要求分配一定的RAM。虽然采用malloc()和free()函数可以实现申请和释放内存的功能,但这两个函数存在以下缺点:并不是在所有的嵌入式系统中都可用,要占用不定的程序空间,可重人性欠缺以及执行时间具有不可确定性。为此,除了可采用malloc()和free()函数外,FreeRTOS还提供了另外两种内存分配的策略,用户可以根据实际需要选择不同的内存分配策略。

freertos任务切换需要多少个时钟周期

3,实时时钟晶振的频率是多少

手机中的时钟大致分为逻辑电路主时钟和实时时钟两大类。逻辑电路的主时钟通常有13M、26M、和19.5M等;实时时钟一般为32.768KHz。无论是逻辑电路的主时钟还是实时时钟,均是手机正常工作的必要条件,由于手机各厂家设计思路和电路结构不同,主时钟和实时时钟电路若不正常时,反映出的故障现象也不尽相同。

实时时钟晶振的频率是多少

4,FreeRTOS操作系统例程8消息队列

安富莱电子 www.armfly.com 安富莱_STM32-V5开发板_FreeRTOS教程(V1.0)static QueueHandle_t xQueue1 = NULL; static QueueHandle_t xQueue2 = NULL; typedef struct Msg uint8_t ucMessageID; uint16_t usData[2]; uint32_t ulData[2]; }MSG_T; MSG_T g_tMsg; /* ********************************************************************************************************* * 函 数 名: AppObjCreate * 功能说明: 创建任务通信机制 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppObjCreate (void) /* 创建 10 个 uint8_t 型消息队列 */ xQueue1 = xQueueCreate(10, sizeof(uint8_t)); if( xQueue1 == 0 ) /* 没有创建成功,用户可以在这里加入创建失败的处理机制 */ } /* 创建 10 个存储指针变量的消息队列,由于 CM3/CM4 内核是 32 位机,一个指针变量占用 4 个字节 */ xQueue2 = xQueueCreate(10, sizeof(struct Msg *)); if( xQueue2 == 0 ) /* 没有创建成功,用户可以在这里加入创建失败的处理机制 */ } } //初始化定义 uint8_t ucCount = 0;/* while循环里实现向 xQueue2 发送数据 */ ucCount++; /* 向消息队列发数据,如果消息队列满了,等待 10 个时钟节拍 */ if( xQueueSend(xQueue1, (void *) &ucCount, (TickType_t)10) != pdPASS ) /* 发送失败,即使等待了 10 个时钟节拍 */ printf("向 xQueue1 发送数据失败,即使等待了 10 个时钟节拍\r\n"); } else /* 发送成功 */ printf("向 xQueue1 发送数据成功\r\n"); } //初始化定义 MSG_T *ptMsg; /* 初始化结构体指针 */ ptMsg = &g_tMsg; /* 初始化数组 */ ptMsg->ucMessageID = 0; ptMsg->ulData[0] = 0; ptMsg->usData[0] = 0;/* while循环里实现向 xQueue2 发送数据 */ ptMsg->ucMessageID++; ptMsg->ulData[0]++;; ptMsg->usData[0]++; /* 使用消息队列实现指针变量的传递 */ if(xQueueSend(xQueue2, /* 消息队列句柄 */ (void *) &ptMsg, /* 发送结构体指针变量 ptMsg 的地址 */ (TickType_t)10) != pdPASS ) /* 发送失败,即使等待了 10 个时钟节拍 */ printf("向 xQueue2 发送数据失败,即使等待了 10 个时钟节拍\r\n"); } else /* 发送成功 */ printf("向 xQueue2 发送数据成功\r\n"); }static QueueHandle_t xQueue1 = NULL; /* ********************************************************************************************************* * 函 数 名: vTaskMsgPro * 功能说明: 使用函数 xQueueReceive 接收任务 vTaskTaskUserIF 发送的消息队列数据(xQueue1) * 形 参: pvParameters 是在创建该任务时传递的形参 * 返 回 值: 无 * 优 先 级: 3 ********************************************************************************************************* */ static void vTaskMsgPro(void *pvParameters) BaseType_t xResult; const TickType_t xMaxBlockTime = pdMS_TO_TICKS(300); /* 设置最大等待时间为 300ms */ uint8_t ucQueueMsgValue; while(1) xResult = xQueueReceive(xQueue1, /* 消息队列句柄 */ (void *)&ucQueueMsgValue, /* 存储接收到的数据到变量 ucQueueMsgValue 中 */ (TickType_t)xMaxBlockTime);/* 设置阻塞时间 */ if(xResult == pdPASS) /* 成功接收,并通过串口将数据打印出来 */ printf("接收到消息队列数据 ucQueueMsgValue = %d\r\n", ucQueueMsgValue); } else /* 超时 */ bsp_LedToggle(1); bsp_LedToggle(4); } } } /* ********************************************************************************************************* * 函 数 名: vTaskLED * 功能说明: 使用函数 xQueueReceive 接收任务 vTaskTaskUserIF 发送的消息队列数据(xQueue2) * 形 参: pvParameters 是在创建该任务时传递的形参 * 返 回 值: 无 * 优 先 级: 2 ********************************************************************************************************* */ static void vTaskLED(void *pvParameters) MSG_T *ptMsg; BaseType_t xResult; const TickType_t xMaxBlockTime = pdMS_TO_TICKS(200); /* 设置最大等待时间为 200ms */ while(1) xResult = xQueueReceive(xQueue2, /* 消息队列句柄 */ (void *)&ptMsg, /* 这里获取的是结构体的地址 */ (TickType_t)xMaxBlockTime);/* 设置阻塞时间 */ if(xResult == pdPASS) /* 成功接收,并通过串口将数据打印出来 */ printf("接收到消息队列数据 ptMsg->ucMessageID = %d\r\n", ptMsg->ucMessageID); printf("接收到消息队列数据 ptMsg->ulData[0] = %d\r\n", ptMsg->ulData[0]); printf("接收到消息队列数据 ptMsg->usData[0] = %d\r\n", ptMsg->usData[0]); } else /* 超时 */ bsp_LedToggle(2); bsp_LedToggle(3); } } } /*按键或什么外部触发启动定时器*/ printf("启动单次定时器中断,50ms 后在定时器中断给任务 vTaskMsgPro 发送消息\r\n"); bsp_StartHardTimer(1 ,50000, (void *)TIM_CallBack1);printf("启动单次定时器中断,50ms 后在定时器中断给任务 vTaskLED 发送消息\r\n"); bsp_StartHardTimer(2 ,50000, (void *)TIM_CallBack2);/* ********************************************************************************************************* * 函 数 名: TIM_CallBack1 和 TIM_CallBack2 * 功能说明: 定时器中断的回调函数,此函数被 bsp_StartHardTimer 所调用。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static uint32_t g_uiCount = 0; /* 设置为全局静态变量,方便数据更新 */ static void TIM_CallBack1(void) BaseType_t xResult; BaseType_t xHigherPriorityTaskWoken = pdFALSE; /* 中断消息处理,此处省略 */ …… g_uiCount++; /* 向消息队列发数据 */ xQueueSendFromISR(xQueue1, (void *)&g_uiCount, &xHigherPriorityTaskWoken); /* 如果 xHigherPriorityTaskWoken = pdTRUE,那么退出中断后切到当前最高优先级任务执行 */ portYIELD_FROM_ISR(xHigherPriorityTaskWoken); }static void TIM_CallBack2 (void) MSG_T *ptMsg; BaseType_t xHigherPriorityTaskWoken = pdFALSE; /* 中断消息处理,此处省略 */ …… /* 初始化结构体指针 */ ptMsg = &g_tMsg; /* 初始化数组 */ ptMsg->ucMessageID++; ptMsg->ulData[0]++; ptMsg->usData[0]++; /* 向消息队列发数据 */ xQueueSendFromISR(xQueue2, (void *)&ptMsg, &xHigherPriorityTaskWoken); /* 如果 xHigherPriorityTaskWoken = pdTRUE,那么退出中断后切到当前最高优先级任务执行 */ portYIELD_FROM_ISR(xHigherPriorityTaskWoken); }

5,ucos时钟节拍有什么用

USOC II 要求提供定时中断,以实现延时与超时控制等功能。这个定时中断就是时钟节拍,它应该发生10-100次每秒。时钟节拍的频率越高,系统负荷越重
ucos里,时钟节拍就好比是人的心脏一样重要。它对于CPU能顺利在各任务间切换有着至关重要的作用。  使用时钟源有一个特别需要注意的地方:用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。  ucos中的时钟节拍服务是通过在定时器中断服务子程序中调用OSTimeTick()实现的。  ucos要求提供定时中断,以实现延时与超时控制等功能。这个定时中断就是时钟节拍,它应该发生10-100次每秒。  时钟节拍的频率越高,系统负荷越重。
看时间啊

6,FreeRTOS任务相关API函数

1、函数 uxTaskPriorityGet() 此函数用来获取指定任务的优先级, 要使用此函数的话宏 INCLUDE_uxTaskPriorityGet 应该定义为 1, 函数原型如下: 参数: xTask: 要查找的任务的任务句柄。 返回值: 获取到的对应的任务的优先级。 2、函数 vTaskPrioritySet() 此 函 数 用 于 改 变 某 一 个 任 务 的 任 务 优 先 级 , 要 使 用 此 函 数 的 话 宏INCLUDE_vTaskPrioritySet 应该定义为 1,函数原型如下: 参数: xTask: 要查找的任务的任务句柄。 uxNewPriority: 任务要使用的新的优先级, 可以是 0~ configMAX_PRIORITIES – 1。 返回值: 无。 3、 uxTaskGetSystemState() 此函数用于获取系统中所有任务的任务壮态,每个任务的壮态信息保存在一个 TaskStatus_t类型的结构体里面, 这个结构体里面包含了任务的任务句柄、任务名字、堆栈、优先级等信息,要使用此函数的话宏 configUSE_TRACE_FACILITY 应该定义为 1, 函数原型如下: 参数: pxTaskStatusArray: 指向 TaskStatus_t 结构体类型的数组首地址,每个任务至少需要一个TaskStatus_t 结 构 体 , 任 务 的 数 量 可 以 使 用 函 数uxTaskGetNumberOfTasks()。 结构体 TaskStatus_t 在文件 task.h 中有如下 定义: uxArraySize: 保存任务壮态数组的数组的大小。 pulTotalRunTime: 如果 configGENERATE_RUN_TIME_STATS 为 1 的话此参数用来保存系统总的运行时间。 返回值: 统计到的任务壮态的个数,也就是填写到数组 pxTaskStatusArray 中的个 数,此值应该等于函数 uxTaskGetNumberOfTasks()的返回值。如果参数 uxArraySize 太小的话返回值可能为 0。 4、函数 vTaskGetInfo() 此函数也是用来获取任务壮态的,但是是获取指定的单个任务的壮态的,任务的壮态信息填充到参数 pxTaskStatus 中,这个参数也是 TaskStatus_t 类型的。要使用此函数的话宏configUSE_TRACE_FACILITY 要定义为 1,函数原型如下: 参数: xTask: 要查找的任务的任务句柄。 pxTaskStatus: 指向类型为 TaskStatus_t 的结构体变量。 xGetFreeStackSpace: 在结构体 TaskStatus_t 中有个字段 usStackHighWaterMark 来保存自任务运行以来任务堆栈剩余的历史最小大小,这个值越小说明越接近堆栈溢出,但是计算这个值需要花费一点时间, 所以我们可以通过将xGetFreeStackSpace设置为pdFALSE来跳过这个步骤,当设置为pdTRUE的时候就会检查堆栈的历史剩余最小值。 eState: 结构体 TaskStatus_t 中有个字段 eCurrentState 用来保存任务运行壮态, 这个字段是 eTaskState 类型的,这是个枚举类型,在 task.h 中有如下定 义: 获取任务运行壮态会耗费不少时间,所以为了加快函数 vTaskGetInfo()的执行速度结构体 TaskStatus_t 中的字段 eCurrentState 就可以由用户直接赋值,参数 eState 就是要赋的值。如果不在乎这点时间,那么可以将 eState 设置为eInvalid,这样任务的壮态信息就由函数 vTaskGetInfo()去想办法获取。 返回值: 无 5、 函数 xTaskGetApplicationTaskTag() 此函数用于获取任务的 Tag(标签)值,任务控制块中有个成员变量 pxTaskTag 来保存任务的标签值。标签的功能由用户自行决定,此函数就是用来获取这个标签值的, FreeRTOS 系统内核是不会使用到这个标签的。要使用此函数的话宏 configUSE_APPLICATION_TASK_TAG 必须为1,函数原型如下: 参数: xTask: 要获取标签值的任务对应的任务句柄,如果为 NULL 的话就获取当前正在运行的任务标签值。 返回值: 任务的标签值。 6、 函数 xTaskGetCurrentTaskHandle() 此函数用于获取当前任务的任务句柄, 其实获取到的就是任务控制块,在前面讲解任务创建 函 数 的 时 候 说 过 任 务 句 柄 就 是 任 务 控 制 。 如 果 要 使 用 此 函 数 的 话 宏INCLUDE_xTaskGetCurrentTaskHandle 应该为 1,函数原型如下: 参数: 无 返回值: 当前任务的任务句柄。 7、 函数 xTaskGetHandle() 此函数根据任务名字获取任务的任务句柄,在使用函数 xTaskCreate()或 xTaskCreateStatic()创建任务的时候都会给任务分配一个任务名,函数 xTaskGetHandle()就是使用这个任务名字来查询其对应的任务句柄的。 要使用此函数的话宏 INCLUDE_xTaskGetHandle 应该设置为 1,此函数原型如下: 参数: pcNameToQuery: 任务名, C 语言字符串。 返回值: NULL: 没有任务名 pcNameToQuery 所对应的任务。 其他值: 任务名 pcNameToQuery 所对应的任务句柄 8、函数 xTaskGetIdleTaskHandle() 此 函 数 用 于 返 回 空 闲 任 务 的 任 务 句 柄 , 要 使 用 此 函 数 的 话 宏INCLUDE_xTaskGetIdleTaskHandle 必须为 1,函数原型如下: 参数: 无 返回值: 空闲任务的任务句柄。 9、函数 uxTaskGetStackHighWaterMark() 每个任务都有自己的堆栈,堆栈的总大小在创建任务的时候就确定了,此函数用于检查任务从创建好到现在的历史剩余最小值, 这个值越小说明任务堆栈溢出的可能性就越大!FreeRTOS 把这个历史剩余最小值叫做“高水位线”。此函数相对来说会多耗费一点时间,所以在 代 码 调 试 阶 段 可 以 使 用 , 产 品 发 布 的 时 候 最 好 不 要 使 用 。 要 使 用 此 函 数 的 话 宏INCLUDE_uxTaskGetStackHighWaterMark 必须为 1,此函数原型如下: 参数: xTask: 要查询的任务的任务句柄,当这个参数为 NULL 的话说明查询自身任务(即调用函数 uxTaskGetStackHighWaterMark()的任务)的“高水位线”。 返回值: 任务堆栈的“高水位线”值,也就是堆栈的历史剩余最小值。 10、函数 eTaskGetState() 此函数用于查询某个任务的运行壮态,比如:运行态、阻塞态、挂起态、就绪态等,返回值是个枚举类型。要使用此函数的话宏 INCLUDE_eTaskGetState 必须为 1,函数原型如下: 参数: xTask: 要查询的任务的任务句柄。 返回值: 返回值为 eTaskState 类型,这是个枚举类型,在文件 task.h 中有定义,前面讲解函数 vTaskGetInfo()的时候已经讲过了。 11、函数 pcTaskGetName() 根据某个任务的任务句柄来查询这个任务对应的任务名,函数原型如下: 参数: xTaskToQuery: 要查询的任务的任务句柄,此参数为 NULL 的话表示查询自身任务(调 用函数 pcTaskGetName())的任务名字 返回值: 返回任务所对应的任务名。 12、函数 xTaskGetTickCount() 此函数用于查询任务调度器从启动到现在时间计数器 xTickCount 的值。 xTickCount 是系统的时钟节拍值,并不是真实的时间值。 每个滴答定时器中断 xTickCount 就会加 1, 一秒钟滴答定时器中断多少次取决于宏 configTICK_RATE_HZ。理论上 xTickCount 存在溢出的问题,但是这个溢出对于 FreeRTOS 的内核没有影响,但是如果用户的应用程序有使用到的话就要考虑溢出了。什么时候溢出取决于宏 configUSE_16_BIT_TICKS,当此宏为 1 的时候 xTixkCount 就是个 16 位的变量,当为 0 的时候就是个 32 位的变量。 函数原型如下: 参数: 无。 返回值: 时间计数器 xTickCount 的值。 13、函数 xTaskGetTickCountFromISR() 此函数是 xTaskGetTickCount()的中断级版本,用于在中断服务函数中获取时间计数器xTickCount 的值,函数原型如下: 参数: 无。 返回值: 时间计数器 xTickCount 的值。 14、 函数 xTaskGetSchedulerState() 此函数用于获取 FreeRTOS 的任务调度器运行情况:运行?关闭?还是挂起! 要使用此函数的话宏 INCLUDE_xTaskGetSchedulerState 必须为 1,此函数原型如下: 参数: 无。 返回值: taskSCHEDULER_NOT_STARTED: 调 度 器 未 启 动 , 调 度 器 的 启 动 是 通 过 函 数vTaskStartScheduler() 来 完 成 , 所 以 在 函 数vTaskStartScheduler() 未 调 用 之 前 调 用 函 数xTaskGetSchedulerState()的话就会返回此值。 taskSCHEDULER_RUNNING: 调度器正在运行。 taskSCHEDULER_SUSPENDED: 调度器挂起。 15、 函数 uxTaskGetNumberOfTasks() 此函数用于查询系统当前存在的任务数量,函数原型如下: 参数: 无。 返回值: 当前系统中存在的任务数量, 此值=挂起态的任务+阻塞态的任务+就绪态的任务+空闲任务+运行态的任务。 16、函数 vTaskList() 此函数会创建一个表格来描述每个任务的详细信息 表中的信息如下: Name: 创建任务的时候给任务分配的名字。 State: 任务的壮态信息, B 是阻塞态, R 是就绪态, S 是挂起态, D 是删除态。 Priority:任务优先级。 Stack: 任务堆栈的“高水位线”,就是堆栈历史最小剩余大小。 Num: 任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此 编号来做区分。 函数原型如下: 参数: pcWriteBuffer: 保存任务壮态信息表的存储区。 存储区要足够大来保存任务状态信息表。 返回值: 无 17、 函数 vTaskGetRunTimeStats() FreeRTOS 可以通过相关的配置来统计任务的运行时间信息, 任务的运行时间信息提供了每个任务获取到 CPU 使用权总的时间。函数 vTaskGetRunTimeStats()会将统计到的信息填充到一个表里面,表里面提供了每个任务的运行时间和其所占总时间的百分比 函 数 vTaskGetRunTimeStats() 是 一 个 很 实 用 的 函 数 , 要 使 用 此 函 数 的 话 宏configGENERATE_RUN_TIME_STATS 和 configUSE_STATS_FORMATTING_FUNCTIONS 必须都为 1。如果宏 configGENERATE_RUN_TIME_STATS 为 1 的话还需要实现一下几个宏定义: ● portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(),此宏用来初始化一个外设来提供时间统计功能所需的时基, 一般是定时器/计数器。这个时基的分辨率一定要比 FreeRTOS的系统时钟高,一般这个时基的时钟精度比系统时钟的高 10~20 倍就可以了。 ● portGET_RUN_TIME_COUNTER_VALUE()或者portALT_GET_RUN_TIME_COUNTER_VALUE(Time), 这两个宏实现其中一个就行了,这两个宏用于提供当前的时基的时间值。 函数原型如下: 参数: pcWriteBuffer: 保存任务时间信息的存储区。存储区要足够大来保存任务时间信息。 返回值: 无 18、函数 vTaskSetApplicationTaskTag() 此函数是为高级用户准备的,此函数用于设置某个任务的标签值 ,这个标签值的具体函数和用法由用户自行决定, FreeRTOS 内核不会使用这个标签值,如果要使用此函数的话宏configUSE_APPLICATION_TASK_TAG 必须为 1, 函数原型如下: 参数: xTask: 要设置标签值的任务,此值为 NULL 的话表示设置自身任务的标签值。 pxHookFunction: 要设置的标签值,这是一个 TaskHookFunction_t 类型的函数指针,但是也可以设置为其他值。 返回值: 无 19、函数 SetThreadLocalStoragePointer() 此函数用于设置线程本地存储指针的值,每个任务都有它自己的指针数组来作为线程本地存储,使用这些线程本地存储可以用来在任务控制块中存储一些应用信息,这些信息只属于任务 自 己 的 。 线 程 本 地 存 储 指 针 数 组 的 大 小 由 宏configNUM_THREAD_LOCAL_STORAGE_POINTERS 来决定的。如果要使用此函数的话宏configNUM_THREAD_LOCAL_STORAGE_POINTERS 不能为 0,宏的具体值是本地存储指针 数组的大小, 函数原型如下: 参数: xTaskToSet: 要设置线程本地存储指针的任务的任务句柄,如果是 NULL 的话表示设置任务自身的线程本地存储指针。 xIndex: 要设置的线程本地存储指针数组的索引。 pvValue: 要存储的值。 返回值: 无 20、函数 GetThreadLocalStoragePointer() 此 函 数 用 于 获 取 线 程 本 地 存 储 指 针 的 值 , 如 果 要 使 用 此 函 数 的 话 宏configNUM_THREAD_LOCAL_STORAGE_POINTERS 不能为 0,函数原型如下: 参数: xTaskToSet: 要获取的线程本地存储指针的任务句柄,如果是 NULL 的话表示获取任务自身的线程本地存储指针。 xIndex: 要获取的线程本地存储指针数组的索引。 返回值: 获取到的线程本地存储指针的值

7,如果CPU的时钟频率为5MHZ那么它的一个时钟周期为 多少 ns

t=1/f ,计算公式为1/5000000Hz=0.0000002s=200nsT单位是秒,表示周期.f单位是赫兹,表示每秒震动多少次.所以,秒=1/(次数/秒)=秒.频率在数学表达式中用“f”表示,其相应的单位有:Hz(赫)、kHz(千赫)、MHz(兆赫)、GHz(吉赫)。其中1GHz=1000MHz,1MHz=1000kHz,1kHz=1000Hz。计算脉冲信号周期的时间单位及相应的换算关系是:s(秒)、ms(毫秒)、μs(微秒)、ns(纳秒),其中:1s=1000ms,1 ms=1000μs,1μs=1000ns。
t=1/f (t为时钟周期,f为时钟频率)200ns
周期就是频率的倒数啊,24m=24000000所以周期t=1/24000000 s

8,什么是CPU的时钟周期和时钟频率

时钟周期是由CPU时钟定义的定长时间间隔,是CPU工作的最小时间单位,也称节拍脉冲或T周期。通常为节拍脉冲或T周期,既主频的倒数,它是处理操作的最基本的单位。  在微程序控制器中,时序信号比较简单,一般采用节拍电位——节拍脉冲二级体制。就是说它只要一个节拍电位,在节拍电位又包含若干个节拍脉冲(时钟周期)。节拍电位表示一个CPU周期的时间,而节拍脉冲把一个CPU周期划分为几个叫较小的时间间隔。根据需要这些时间间隔可以相等,也可以不等。所以说时钟周期跟外频是没啥关系的。另外你说的时钟频率,这个一般都是指主频了,这个没错。时钟频率,是提供电脑定时信号的一个源,这个源产生不同频率的基准信号,用来同步CPU的每一步操作,通常简称其为频率。CPU的主频,是其核心内部的工作频率(核心时钟频率),它是评定CPU性能的重要指标。
cpu的主频,即cpu内核工作的时钟频率(cpu clock speed)。通常所说的某某cpu是多少兆赫的,而这个多少兆赫就是“cpu的主频”。很多人认为cpu的主频就是其运行速度,其实不然。cpu的主频表示在cpu内数字脉冲信号震荡的速度,与cpu实际的运算能力并没有直接关系。主频和实际的运算速度存在一定的关系,但目前还没有一个确定的公式能够定量两者的数值关系,因为cpu的运算速度还要看cpu的流水线的各方面的性能指标(缓存、指令集,cpu的位数等等)。由于主频并不直接代表运算速度,所以在一定情况下,很可能会出现主频较高的cpu实际运算速度较低的现象。比如amd公司的athlonxp系列cpu大多都能已较低的主频,达到英特尔公司的pentium 4系列cpu较高主频的cpu性能,所以athlonxp系列cpu才以pr值的方式来命名。因此主频仅是cpu性能表现的一个方面,而不代表cpu的整体性能。 cpu的主频不代表cpu的速度,但提高主频对于提高cpu运算速度却是至关重要的。举个例子来说,假设某个cpu在一个时钟周期内执行一条运算指令,那么当cpu运行在100mhz主频时,将比它运行在50mhz主频时速度快一倍。因为100mhz的时钟周期比50mhz的时钟周期占用时间减少了一半,也就是工作在100mhz主频的cpu执行一条运算指令所需时间仅为10ns比工作在50mhz主频时的20ns缩短了一半,自然运算速度也就快了一倍。只不过电脑的整体运行速度不仅取决于cpu运算速度,还与其它各分系统的运行情况有关,只有在提高主频的同时,各分系统运行速度和各分系统之间的数据传输速度都能得到提高后,电脑整体的运行速度才能真正得到提高。 提高cpu工作主频主要受到生产工艺的限制。由于cpu是在半导体硅片上制造的,在硅片上的元件之间需要导线进行联接,由于在高频状态下要求导线越细越短越好,这样才能减小导线分布电容等杂散干扰以保证cpu运算正确。因此制造工艺的限制,是cpu主频发展的最大障碍之一。

文章TAG:freertos的时钟节拍选择多少时钟  节拍  选择  
下一篇