This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2640R2F NoRTOS_start()函数的作用

Other Parts Discussed in Thread: CC2640R2F

Hi Ti JRs;

    请教个问题~~

    我在尝试把 uartecho 例程移植到 simple_broadcaster 里,结果是函数跑到 UART_write 、UART_read 函数时就会 crash。

    我又做了实验,在 uartecho 例程里,注释掉 NoRTOS_start();,这样测试结果就和上面现象一样。

所以请问下:

1. NoRTOS_start()函数的作用是什么?

2. 在 tirtos 里有没有和 NoRTOS_start()函数作用相同的函数?

谢谢

  • NoRTOS_start()是无操作系统的启动函数,如果你simple_broadcaster使用的是tirtos的话,直接移植这里的C:\ti\simplelink_cc2640r2_sdk_4_20_00_04\examples\rtos\CC2640R2_LAUNCHXL\drivers\uartecho
  • Hi Kevin:

    谢谢~~

    我才发现,原来 rtos 系统下也有一个 uartecho 例程。

    我重新移植下。
  • Hi Kevin:


    我在把 examples\rtos\CC2640R2_LAUNCHXL\drivers\uartecho 例程移植到 simple_broadcaster 里时遇到几个 link 的错误,是下面几个 pthread 相关的函数找不到,请问下,这几个函数是在哪个 lib 里的?我没搜到啊~~

    谢谢


    undefined first referenced
    symbol in file
    --------- ----------------
    pthread_attr_init <whole-program>
    pthread_attr_setdetachstate <whole-program>
    pthread_attr_setschedparam <whole-program>
    pthread_attr_setstacksize <whole-program>
    pthread_create <whole-program>
  • 在C:\ti\simplelink_cc2640r2_sdk_4_20_00_04\source\ti\posix\ccs中的pthread H文件中
  • Hi Kevin:

         应该不是单纯的增加这个 #include <pthread.h>。

         在编译 simple_broadcaster 这个 example project 时 默认是不会编译 source\ti\posix\ccs 这个目录的。

          我做了如下的修改,请看下面图片,我在 CCS 的 simple_broadcaster  project 里增加了 ${SRC_BLE_DIR}/../../../source/ti/posix/ccs ,并在代码里增加了 #include <pthread.h>,这样编译还是出错。

        请问这是为什么?

    谢谢

  • 不是简单的包含,关于posix可以看下这里:dev.ti.com/.../node
    移植串口程序想实现什么功能呢,如果只是想用串口,不用移植main_tirtos.c中的代码

  • Hi Kevin:

    我想修改 advertData 里的 Major 和 Minor 值。

    没有现成的工具可以用,我是想通过串口写入一个值,根据这个值在开机时重新Major 和 Minor 值。

    e2echina.ti.com/.../192470

    谢谢
  • 那就添加这里的驱动C:\ti\simplelink_cc2640r2_sdk_4_20_00_04\source\ti\drivers\uart
  • Hi Kevin:

    请教下,你的意思是我不需要移植 uartecho 例程了,只需要 source\ti\drivers\uart 驱动就可以了,是吗?

    谢谢
  • 是的,只移植驱动就可以调用里面的函数
  • Hi Kevin:

    我看 source\ti\drivers\uart 目录下有 UARTCC26X0、UARTCC26X2、UARTCC26XX 这三个型号的驱动。

    我编译 simple_broadcaster 这个 project 默认是不会编译 source\ti\drivers\uart 目录下的文件的。

    我用的是 CC2640R2F 4x4 封装的,请问我应该选择用哪个型号的驱动呢?

    例如:我选用了 UARTCC26X0.c 这个驱动,我改怎样修改才能让 UARTCC26X0.c 参与编译呢?

    谢谢
  • Hi Kevin:

    我刚刚考虑了一下,其实我不需要什么系统的,我只要UART 驱动就可以,也就是说,开机后 UART 初始化成功,能 UART_open() 成功,

    然后就可以一直循环在 UART_read(); 和 UART_write(); 里,这样应该就能达到我的目标了。


    我现在的试验是:我去掉了 posix,开机就 Board_init() 、然后 GPIO_init() 、UART_init() ,再 UART_open() ,到这里都是 OK 的,但是后面调用 UART_write(uart, echoPrompt, sizeof(echoPrompt)); 时出了问题。

    这样就又变成我提的问题了。

    所以我的疑问是:UART_write() 函数一定要跑在什么系统里吗?

    谢谢




    int main()
    {
    /* Register Application callback to trap asserts raised in the Stack */
    RegisterAssertCback(AssertHandler);

    /* Call driver init functions */
    Board_init();

    fih_uart_cmd();

    return 0;
    }




    /*
    * ======== mainThread ========
    */
    void fih_uart_cmd(void)
    {
    char input;
    UART_Handle uart;
    UART_Params uartParams;
    const char echoPrompt[] = "FIH_BCN:\r\n";

    led_gpio_init();


    /* Call driver init functions */
    GPIO_init();

    UART_init();

    //gpio_set_value(1);
    //BIOS_start();



    /* Configure the LED pin */
    //GPIO_setConfig(BEACON_LED_IO, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /* Turn on user LED */
    //GPIO_write(BEACON_LED_IO, 1);

    /* Create a UART with data processing off. */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_RETURN_FULL;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.baudRate = 115200;



    uart = UART_open(Board_UART0, &uartParams);

    if (uart == NULL)
    {
    //gpio_set_value(1);

    /* UART_open() failed */
    while (1);
    }

    gpio_set_value(1);
    UART_write(uart, echoPrompt, sizeof(echoPrompt)); 《========= 这个地方出问题了


    /* Loop forever echoing */
    while (1)
    {
    //gpio_set_value(1);

    UART_read(uart, &input, 1);
    UART_write(uart, &input, 1);
    }
    }
  • 串口程序本身并不依赖操作系统,但你的simple broadcaster用了tirtos,移植需要将驱动添加到你的工程中,包含头文件,初始化等

  • Hi Kevin:

    移植需要将驱动添加到你的工程中,包含头文件,初始化等 =====》这些都已经加进来了,如果没加这些编译都不会过吧。

    为什么我一跑到 UART_write() 函数就会 crash 呢?

    谢谢
  • 关于posix详细说明看下这里:dev.ti.com/.../node
    crash不清楚具体原因是什么,初始化或配置有问题都有可能导致程序运行不起来
  • Hi Kevin:

    谢谢,现在编译的问题已经解决了。

    我又遇到一个新的问题,请帮忙看下是怎么回事,谢谢~~

    retc = pthread_create(&thread, &attrs, fih_uart_thread, NULL);

    我用上面的语句 pthread_create 了 fih_uart_thread 这个线程,在 fih_uart_thread 函数里只加了一句 LED 灯的关闭,发现 LED 灯没有关的了,所以我怀疑 fih_uart_thread 函数根本就没跑进去。

    请问这时什么原因。

    谢谢


    void *fih_uart_thread(void *arg0)
    {
    gpio_set_value(1);
    }

    static void gpio_set_value(uint8 val)
    {
    PIN_setOutputValue(led_pin_handle, BEACON_LED_IO, val);
    }

  • debug单步运行看一下
  • Hi Kevin:

    关于 CCS 的 Debug 有文档介绍吗?

    谢谢
  • Hi Kevin:

    这个问题我已经解决了,谢谢指导~~。