续前【RA4E2开发板评测】电压检测器 ThreadX显示量程0-3300 mV
了解系统使用情况对于系统优化和配置特别重要。
ThreadX 的 CPU 利用率主要是通过创建一个统计任务和一个空闲任务来实现。
任务当前使用栈是通过任务控制列表检索所有创建的任务实现。因为是开发用可以在展示产品时取消这个代码。
在已经产生文件目录: 
中打开lu.uvprojx
准备在printf_Task_Task.c中加入需要代码在其他进程先tx_thread_sleep(1000)后恢复
#include "printf_Task.h"
#include "uart/uart.h"
/*
*******************************************************************************************************
* ±äÁ¿
*******************************************************************************************************
*/
static TX_MUTEX AppPrintfSemp; /* ÓÃÓÚprintf»¥³â */
//extern void SysTick_ISR(void);
//#define bsp_ProPer1ms SysTick_ISR
/* ͳ¼ÆÈÎÎñʹÓà */
__IO uint8_t OSStatRdy; /* ͳ¼ÆÈÎÎñ¾ÍÐ÷±êÖ¾ */
__IO uint32_t OSIdleCtr; /* ¿ÕÏÐÈÎÎñ¼ÆÊý */
__IO float OSCPUUsage; /* CPU°Ù·Ö±È */
uint32_t OSIdleCtrMax; /* 1ÃëÄÚ×î´óµÄ¿ÕÏмÆÊý OS CPU OSIdleCtrMax = 8224 250906 OS CPU OSIdleCtrMax = 8320 250907 */
uint32_t OSIdleCtrRun; /* 1ÃëÄÚ¿ÕÏÐÈÎÎñµ±Ç°¼ÆÊý */
volatile bool scan_0_3V3_flag= false;
extern volatile bool TBE ;
static TX_THREAD AppTaskIdleTCB;
static uint64_t AppTaskIdleStk[256/8];
static TX_THREAD AppTaskStatTCB;
static uint64_t AppTaskStatStk[512/8];
//static TX_THREAD AppTaskStartTCB;
//static uint64_t AppTaskStartStk[1024/8];
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskStart
* ¹¦ÄÜ˵Ã÷: Æô¶¯ÈÎÎñ¡£
* ÐÎ ²Î: thread_input ÊÇÔÚ´´½¨¸ÃÈÎÎñʱ´«µÝµÄÐβÎ
* ·µ »Ø Öµ: ÎÞ
ÓÅ ÏÈ ¼¶: 2
*********************************************************************************************************
*/
//static void AppTaskStart (ULONG thread_input)
//{
// (void)thread_input;
// tx_thread_sleep(1000);
// while (1)
// {
// /* ÐèÒªÖÜÆÚÐÔ´¦ÀíµÄ³ÌÐò£¬¶ÔÓ¦Âã»ú¹¤³Ìµ÷ÓõÄSysTick_ISR */
//// bsp_ProPer1ms();
// tx_thread_sleep(1);
// }
//}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskStatistic
* ¹¦ÄÜ˵Ã÷: ͳ¼ÆÈÎÎñ£¬ÓÃÓÚʵÏÖCPUÀûÓÃÂʵÄͳ¼Æ¡£ÎªÁ˲âÊÔ¸ü¼Ó׼ȷ£¬¿ÉÒÔ¿ªÆô×¢Ê͵÷ÓõÄÈ«¾ÖÖжϿª¹Ø
* ÐÎ ²Î: thread_input ´´½¨¸ÃÈÎÎñʱ´«µÝµÄÐβÎ
* ·µ »Ø Öµ: ÎÞ
* ÓÅ ÏÈ ¼¶: 30
*********************************************************************************************************
*/
void OSStatInit (void)
{
OSStatRdy = 0;
tx_thread_sleep(2u); /* ʱÖÓͬ²½ */
//__disable_irq();
OSIdleCtr = 0uL; /* Çå¿ÕÏмÆÊý */
//__enable_irq();
tx_thread_sleep(100); /* ͳ¼Æ100msÄÚ£¬×î´ó¿ÕÏмÆÊý */
//__disable_irq();
OSIdleCtrMax = 8320;
if (OSIdleCtr>8320) OSIdleCtrMax = OSIdleCtr; /* ±£´æ×î´ó¿ÕÏмÆÊý */
OSStatRdy = 1;
//__enable_irq();
}
static void AppTaskStat(ULONG thread_input)
{
(void)thread_input;
while (OSStatRdy == 0)
{
tx_thread_sleep(200); /* µÈ´ýͳ¼ÆÈÎÎñ¾ÍÐ÷ */
}
OSIdleCtrMax /= 100uL;
if (OSIdleCtrMax == 0uL)
{
OSCPUUsage = 0u;
}
//__disable_irq();
OSIdleCtr = OSIdleCtrMax * 100uL; /* ÉèÖóõʼCPUÀûÓÃÂÊ 0% */
//__enable_irq();
for (;;)
{
// __disable_irq();
OSIdleCtrRun = OSIdleCtr; /* »ñµÃ100msÄÚ¿ÕÏмÆÊý */
OSIdleCtr = 0uL; /* ¸´Î»¿ÕÏмÆÊý */
// __enable_irq(); /* ¼ÆËã100msÄÚµÄCPUÀûÓÃÂÊ */
OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
tx_thread_sleep(100); /* ÿ100msͳ¼ÆÒ»´Î */
}
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskIDLE
* ¹¦ÄÜ˵Ã÷: ¿ÕÏÐÈÎÎñ
* ÐÎ ²Î: thread_input ´´½¨¸ÃÈÎÎñʱ´«µÝµÄÐβÎ
* ·µ »Ø Öµ: ÎÞ
ÓÅ ÏÈ ¼¶: 31
*********************************************************************************************************
*/
static void AppTaskIDLE(ULONG thread_input)
{
TX_INTERRUPT_SAVE_AREA
(void)thread_input;
while(1)
{
TX_DISABLE
OSIdleCtr++;
TX_RESTORE
}
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskCreate
* ¹¦ÄÜ˵Ã÷: ´´½¨Ó¦ÓÃÈÎÎñ
* ÐÎ ²Î: ÎÞ
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
/*
Èç¹ûʵÏÖÈÎÎñCPUÀûÓÃÂÊͳ¼ÆµÄ»°£¬´Ëº¯Êý½öÓÃÓÚʵÏÖÆô¶¯ÈÎÎñ£¬Í³¼ÆÈÎÎñºÍ¿ÕÏÐÈÎÎñ£¬ÆäËüÈÎÎñÔÚº¯Êý
AppTaskCreateÀïÃæ´´½¨¡£
*/
/**************´´½¨Æô¶¯ÈÎÎñ*********************/
// tx_thread_create(&AppTaskStartTCB, /* ÈÎÎñ¿ØÖÆ¿éµØÖ· */
// "App Task Start", /* ÈÎÎñÃû */
// AppTaskStart, /* Æô¶¯ÈÎÎñº¯ÊýµØÖ· */
// 0, /* ´«µÝ¸øÈÎÎñµÄ²ÎÊý */
// &AppTaskStartStk[0], /* ¶ÑÕ»»ùµØÖ· */
// 1024, /* ¶ÑÕ»¿Õ¼ä´óС */
// 2, /* ÈÎÎñÓÅÏȼ¶*/
// 2, /* ÈÎÎñÇÀÕ¼·§Öµ */
// TX_NO_TIME_SLICE, /* ²»¿ªÆôʱ¼äƬ */
// TX_AUTO_START); /* ´´½¨ºóÁ¢¼´Æô¶¯ */
/**************´´½¨Í³¼ÆÈÎÎñ*********************/
tx_thread_create(&AppTaskStatTCB, /* ÈÎÎñ¿ØÖÆ¿éµØÖ· */
"App Task STAT", /* ÈÎÎñÃû */
AppTaskStat, /* Æô¶¯ÈÎÎñº¯ÊýµØÖ· */
0, /* ´«µÝ¸øÈÎÎñµÄ²ÎÊý */
&AppTaskStatStk[0], /* ¶ÑÕ»»ùµØÖ· */
512, /* ¶ÑÕ»¿Õ¼ä´óС */
30, /* ÈÎÎñÓÅÏȼ¶*/
30, /* ÈÎÎñÇÀÕ¼·§Öµ */
TX_NO_TIME_SLICE, /* ²»¿ªÆôʱ¼äƬ */
TX_AUTO_START); /* ´´½¨ºóÁ¢¼´Æô¶¯ */
/**************´´½¨¿ÕÏÐÈÎÎñ*********************/
tx_thread_create(&AppTaskIdleTCB, /* ÈÎÎñ¿ØÖÆ¿éµØÖ· */
"App Task IDLE", /* ÈÎÎñÃû */
AppTaskIDLE, /* Æô¶¯ÈÎÎñº¯ÊýµØÖ· */
0, /* ´«µÝ¸øÈÎÎñµÄ²ÎÊý */
&AppTaskIdleStk[0], /* ¶ÑÕ»»ùµØÖ· */
256, /* ¶ÑÕ»¿Õ¼ä´óС */
31, /* ÈÎÎñÓÅÏȼ¶*/
31, /* ÈÎÎñÇÀÕ¼·§Öµ */
TX_NO_TIME_SLICE, /* ²»¿ªÆôʱ¼äƬ */
TX_AUTO_START); /* ´´½¨ºóÁ¢¼´Æô¶¯ */
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppObjCreate
* ¹¦ÄÜ˵Ã÷: ´´½¨ÈÎÎñͨѶ
* ÐÎ ²Î: ÎÞ
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
static void AppObjCreate (void)
{
/* ´´½¨»¥³âÐźÅÁ¿ */
tx_mutex_create(&AppPrintfSemp,"AppPrintfSemp",TX_NO_INHERIT);
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: DispTaskInfo
* ¹¦ÄÜ˵Ã÷: ½«ThreadXÈÎÎñÐÅϢͨ¹ý´®¿Ú´òÓ¡³öÀ´
* ÐÎ ²Î£ºÎÞ
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
static void DispTaskInfo(void)
{
TX_THREAD *p_tcb; /* ¶¨ÒåÒ»¸öÈÎÎñ¿ØÖÆ¿éÖ¸Õë */
p_tcb = &AppTaskStatTCB;
/* ´òÓ¡±êÌâ */
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("===============================================================\r\n");
tx_mutex_put(&AppPrintfSemp);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("OS CPU Usage = %5.2f%% OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax); \r\n", OSCPUUsage);
printf("OS CPU OSIdleCtrRun = %d\r\n", OSIdleCtrRun);
printf("OS CPU OSIdleCtrMax = %d\r\n", OSIdleCtrMax);
tx_mutex_put(&AppPrintfSemp);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("===============================================================\r\n");
tx_mutex_put(&AppPrintfSemp);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf(" ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС µ±Ç°Ê¹ÓÃÕ» ×î´óջʹÓà ÈÎÎñÃû\r\n");
tx_mutex_put(&AppPrintfSemp);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf(" Prio StackSize CurStack MaxStack Taskname\r\n");
tx_mutex_put(&AppPrintfSemp);
// App_Printf("===============================================================\r\n");
// App_Printf("OS CPU Usage = %5.2f%%\r\n", OSCPUUsage);
// App_Printf("===============================================================\r\n");
// App_Printf(" ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС µ±Ç°Ê¹ÓÃÕ» ×î´óջʹÓà ÈÎÎñÃû\r\n");
// App_Printf(" Prio StackSize CurStack MaxStack Taskname\r\n");
/* ±éÀúÈÎÎñ¿ØÖÆÁбíTCB list)£¬´òÓ¡ËùÓеÄÈÎÎñµÄÓÅÏȼ¶ºÍÃû³Æ */
while (p_tcb != (TX_THREAD *)0)
{
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf(" %2d %5d %5d %5d %s\r\n",
p_tcb->tx_thread_priority,
p_tcb->tx_thread_stack_size,
(int)p_tcb->tx_thread_stack_end - (int)p_tcb->tx_thread_stack_ptr,
(int)p_tcb->tx_thread_stack_end - (int)p_tcb->tx_thread_stack_highest_ptr,
p_tcb->tx_thread_name);
printf(" %5d \r\n", (int)p_tcb->tx_thread_stack_highest_ptr);
tx_mutex_put(&AppPrintfSemp);
p_tcb = p_tcb->tx_thread_created_next;
if(p_tcb == &AppTaskStatTCB) break;
}
}
/* printF entry function */
void printf_Task_entry(void)
{
/* Äں˿ªÆôºó£¬»Ö¸´HALÀïµÄʱ¼ä»ù×¼ */
// HAL_ResumeTick();
/* TODO: add your own code here */
uint8_t buffer[7];
double a0;
uint8_t * bufferQ=buffer;
uint32_t num = 0;
uint32_t adcValue = 0;
static bool adc_task_active = true;
bool display_flag;
/* Initializing UART */
uart_initialize();
/* ´´½¨ÈÎÎñ */
AppTaskCreate();
/* ´´½¨ÈÎÎñ¼äͨÐÅ»úÖÆ */
AppObjCreate();
/* ÓÅÏÈÖ´ÐÐÈÎÎñͳ¼Æ */
tx_thread_sleep(10);
OSStatInit();
int i=0;
while(true)
{
i++;
//TX_NO_INSTANCEÊÇThreadX¶¨ÒåµÄ³£Á¿£¬±íʾÐźÅÁ¿ÊµÀý²»´æÔÚ
//µ±º¯Êý·µ»ØTX_NO_INSTANCEʱ£¬±íʾϵͳÎÞ·¨ÕÒµ½ÃûΪsemphr_keyChangedµÄÐźÅÁ¿ÊµÀý¡£Õâͨ³£Òâζ×Å£º
//ÐźÅÁ¿ÉÐδ±»´´½¨
//ÐźÅÁ¿Ãû³ÆÆ´Ð´´íÎó
//ÐźÅÁ¿Òѱ»É¾³ý
//ÕâÖÖ¼ì²éÔÚÐèҪȷ±£ÐźÅÁ¿´æÔÚºó²ÅÄܰ²È«Ê¹Óõij¡¾°Öкܳ£¼û¡£
if (tx_semaphore_get (&semphr_keyChanged, 0) == TX_NO_INSTANCE)
{
}
else
{scan_0_3V3_flag=!scan_0_3V3_flag;
// printf("!scan_0_3V3_flag;S_key 1 \r\n");
}
tx_thread_sleep(10);
if(i==6000){
DispTaskInfo();
i=0;
}
if (tx_queue_receive (&queue_adcValue, &num, 0) == TX_SUCCESS )
{
printf("ADC:%d\r\n", num);
a0 = (double)(num*3.3/4095);
printf("ADC:%%.3f V\r\n", a0);
buffer[3]=(uint8_t *)(num>8);
buffer[4]=(uint8_t *)(num&0xff);
buffer[0]=0xff;
buffer[1]=0xfe;
buffer[2]=0x01;
buffer[5]=0x0;
TBE = false;
R_SCI_UART_Write(&g_uart0_ctrl, bufferQ, 6);
while(TBE == false);
TBE = false;
}
}
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: App_Printf
* ¹¦ÄÜ˵Ã÷: Ḭ̈߳²È«µÄprintf·½Ê½
* ÐÎ ²Î: ͬprintfµÄ²ÎÊý¡£
* ÔÚCÖУ¬µ±ÎÞ·¨Áгö´«µÝº¯ÊýµÄËùÓÐʵ²ÎµÄÀàÐͺÍÊýĿʱ,¿ÉÒÔÓÃÊ¡ÂÔºÅÖ¸¶¨²ÎÊý±í
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
//static void App_Printf(const char *fmt, ...)
//{
// char buf_str[200 + 1]; /* ÌØ±ð×¢Ò⣬Èç¹ûprintfµÄ±äÁ¿½Ï¶à£¬×¢Òâ´Ë¾Ö²¿±äÁ¿µÄ´óСÊÇ·ñ¹»Óà */
// va_list v_args;
// va_start(v_args, fmt);
// (void)vsnprintf((char *)&buf_str[0],
// (size_t ) sizeof(buf_str),
// (char const *) fmt,
// v_args);
// va_end(v_args);
// /* »¥³â²Ù×÷ */
// tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
// printf("%s", buf_str);
// tx_mutex_put(&AppPrintfSemp);
//}
‘在hal_entry.c不需要加入任何代码所有与os有关代码由[瑞萨]在生成项目时完成了.’
这次编译没有出错
compiling vector_data.c...
linking...
Program Size: Code=17468 RO-data=908 RW-data=2320 ZI-data=12148
FromELF: creating hex file...
After Build - User command #1: cmd /c ""E:\lst\ra4l1\ra4-e2-64\FSP_Project\rasc_launcher.bat" "E:\lst\ra4l1\ra4-e2-64\FSP_Project\rasc_version.txt" -nosplash --launcher.suppressErrors --gensmartbundle --compiler ARMv6 --devicefamily ra "E:\lst\ra4l1\ra4-e2-64\FSP_Project\configuration.xml" "E:\lst\ra4l1\ra4-e2-64\FSP_Project\Objects\FSP_Project.axf" 2> "%TEMP%\rasc_stderr.out""
[INFO] Input file "E:\lst\ra4l1\ra4-e2-64\FSP_Project\Objects\FSP_Project.axf" is newer than output file "E:\lst\ra4l1\ra4-e2-64\FSP_Project\Objects\FSP_Project.sbd". Proceeding with RASC invocation...
Generating Smart Bundle..
".\Objects\FSP_Project.axf" - 0 Error(s), 478 Warning(s).
Build Time Elapsed: 00:00:56
配置成sci boot模式

*找到编译后hex文件\FSP_Project\Objects\FSP_Project.hex并copy到Renesas Flash软件安后目录
用type-c usb 连接线连接开发板和电脑在设备管理器找到com口号为com5
在Renesas Flash软件安后目录打开命令窗口每次发送命令前最好按一下复位。运行各命令。
命令rfp-cli -d RA -lp 查看可以用com口
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
[Port]
COM5
COM6
COM7
命令 rfp-cli -d RA -port COM5 -ls查看可以用速度
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
Connecting the tool (COM port)
Tool: COM5
Interface: 2 wire UART
Connecting the target device
Disconnecting the tool[Speed]
9600
115200
命令 rfp-cli -d RA -port COM5 -sig查看目标信息
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
Connecting the tool (COM port)
Tool: COM5
Interface: 2 wire UART
Connecting the target device
Speed: 115,200 bps
Connected to R7FA4E2B93CFM
Signature:
Device: R7FA4E2B93CFM
Boot Firmware Version: V7.0.0
Device Unique ID: 4E4B2D5C5B634B533539393742037771
Device Code: 05
Memory Info:
00000000 - 0000FFFF: Code Flash 1 (Block Size: 8 KB)
00010000 - 0001FFFF: Code Flash 1 (Block Size: 32 KB)
08000000 - 08000FFF: Data Flash 1 (Block Size: 64)
0100A100 - 0100A2FF: Config Area 1 (Block Size: 512)
Disconnecting the tool
Operation successful
命令rfp-cli -d RA -port COM5 -file FSP_Project.hex -p 烧录
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
Load: "E:\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.19\FSP_Project.hex" (Size=42459, CRC=68D14AFE)
Connecting the tool (COM port)
Tool: COM5
Interface: 2 wire UART
Connecting the target device
Speed: 115,200 bps
Connected to R7FA4E2B93CFM
Erasing the target device
[Code Flash 1] 00000000 - 00003FFF
Writing data to the target device
[Code Flash 1] 00000000 - 0000397F
[Config Area 1] 0100A100 - 0100A17F
[Config Area 1] 0100A200 - 0100A2FF
Disconnecting the tool
Operation successful

命令rfp-cli -d RA -port COM5 -rv 0 10 读取目标地址 数量数据
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
Connecting the tool (COM port)
Tool: COM5
Interface: 2 wire UART
Connecting the target device
Speed: 115,200 bps
Connected to R7FA4E2B93CFM
Reading data from the device
[Code Flash 1] 00000000 - 00000009
Address | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------+------------------------------------------------
00000000 | 20 37 00 8D 12 0C 00 00 F9 08
Disconnecting the tool
Operation successful
烧录数据正确成功
MODE CONFIG *
配置成flash模式,运行成功
com显示
S_key 1
ADC:174
ADC:0.140 V
?ADC:2536
ADC:2.044 V
?ADC:2328
ADC:1.876 V
?ADC:466
ADC:0.376 V
?ADC:3198
ADC:2.577 V
?~ADC:746
ADC:0.601 V
?ADC:2676
ADC:2.156 V
?t===============================================================
OS CPU Usage = 23.03% OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
OS CPU OSIdleCtrRun = 640397
OS CPU OSIdleCtrMax = 8320
===============================================================
任务优先级 任务栈大小 当前使用栈 最大栈使用 任务名
Prio StackSize CurStack MaxStack Taskname
30 512 243 536874407 App Task STAT
0
31 256 83 536873719 App Task IDLE
0
2 256 107 536872207 KeySwitch
0
2 1024 251 536871951 ADC_Voltage
0
1 1024 283 536873231 printF
0
ADC:2183
ADC:1.759 V
与FreeRTOS相同线程相比,编程更简便,ro rw rom Size都更小。
达到预期状态。
更多回帖