涂鸦OS版本3.11.2 T5开发板 mutex不安全问题

Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
Post Reply
Gzz_lin
Posts: 6

以下是关键部分函数

初始化

Code: Select all

STATIC MUTEX_HANDLE gx_dis_mutex=NULL;
VOID_T display_init()
{
    if(gx_dis_mutex=NULL)
        tal_mutex_create_init(&gx_dis_mutex);

screen_init();
display_set_page(PAGE_MAIN);
}

任务1,由主线程调用的一个死循环函数,优先级4

Code: Select all

VOID_T display_test_video()
{

UINT8_T i = 0;
while(1)
{
    
    tal_mutex_lock(gx_dis_mutex);
    TAL_PR_NOTICE("\r\ndisplay video start \r\n");
    screen_draw_image(0,0,40,54,gb_co2_nums[i]);
    tal_mutex_unlock(gx_dis_mutex);
    TAL_PR_NOTICE("\r\ndisplay video end \r\n");
    tal_system_sleep(100);
    i++;
    if(i==10)
    {
        i=0;
    }
}
}

任务2为其他线程调用的一个显示函数,优先级1

Code: Select all

VOID_T display_set_co2(UINT16_T value)
{
    UINT8_T str[5];
    UINT8_T i=0;
    UINT8_T num;
    UINT16_T x;
    
tal_mutex_lock(gx_dis_mutex); TAL_PR_NOTICE("\r\nco2 value display start=%d \r\n",value); if(value>999) { num=4; } else if(value>99) { num=3; } else if (value>9) { num=2; } else { num=1; } x=160-(num*20); snprintf(str, sizeof(str), "%d", value); // TAL_PR_NOTICE("co2 value str=%s",str); // TAL_PR_NOTICE("co2 value drwx=%d",x); // if(value<1000) // { // screen_fill(80,115,20,54,0xFFFF); // screen_fill(220,115,20,54,0xFFFF); // } while ((str[i]>=0x30)&&(str[i]<=0x39)) { screen_draw_image(x,115,40,54,gb_co2_nums[str[i]-0x30]); i++; x+=40; } tal_mutex_unlock(gx_dis_mutex); TAL_PR_NOTICE("\r\nco2 value display end=%d \r\n",value); }

执行一阵子之后,最终输出日志显示两个进程都进到了lock里面,同时打印了:co2 value display start=667 和display video start

Code: Select all

[03-26 17:59:49 ty N][31c][display.c:104] 
display video end 

[03-26 17:59:49 ty N][31c][display.c:101] 
display video start 

[03-26 17:59:49 ty N][31c][display.c:104] 
display video end 

[03-26 17:59:49 ty N][31c][display.c:101] 
display video start 

[03-26 17:59:49 ty N][31c][display.c:104] 
display video end 

[03-26 17:59:49 ty N][31c][display.c:101] 
display video start 

[03-26 17:59:49 ty N][31c][display.c:104] 
display video end 

[03-26 17:59:49 ty N][31c][display.c:101] 
display video start 

[03-26 17:59:49 ty N][31c][display.c:104] 
display video end 

[03-26 17:59:49 ty N][31c][display.c:101] 
display video start 

[03-26 17:59:49 ty N][31c][display.c:104] 
display video end 

[03-26 17:59:50 ty N][1ea][co2.c:294] 

 CO2 value=667 


[03-26 17:59:50 ty N][1ea][display.c:51] 
co2 value display start=667 

[03-26 17:59:50 ty N][31c][display.c:101] 
display video start 

[03-26 17:59:50 ty N][407][battery.c:36] 

 ADC0 value = 48 


[03-26 17:59:54 ty D][tuya_devos_health.c,lr:0x2178993] feed watchdog
[03-26 18:00:04 ty D][tuya_devos_health.c,lr:0x2178993] feed watchdog
[03-26 18:00:04 ty D][iot_httpc.c,lr:0x218e575] Post Data: {"devId":"6c161ad4f22344649famwg","t":1742983204}
[03-26 18:00:04 ty D][iot_httpc.c,lr:0x218e683] Post URL: https://a6.tuyacn.com/d.json?a=tuya.device.timer.astronomical.list&devId=6c161ad4f22344649famwg&et=3&t=1742983204&v=1.0&sign=61a1eb35a93072073f0c747085d3ea59
[03-26 18:00:04 ty D][httpc.c,lr:0x2186f71] Connect: a6.tuyacn.com Port: 443  -->>
[03-26 18:00:04 ty D][uni_network.c,lr:0x2169f0b] unw_gethostbyname a6.tuyacn.com, prio 1
[03-26 18:00:04 ty D][uni_network.c,lr:0x2169f6b] use dynamic dns ip:47.116.198.59 for domain:a6.tuyacn.com
tkl_net_socket_create type(0), fd(3)!
Post Reply