Hi,
I have a K60 tower board: TWRK60F120MUM.
I have observed an interesting MQX programming topic related to the SDCard task. I hope some expert can point me where is the issue.
I worked out SD card init, open file, and write file based on demo.c of the SDCard task. Summaried here:
I moved FILE pointers as global to retain the handle valves:
The SDCard_Init runs as a task. (as demo.c)
volatile MQX_FILE_PTR | ghComHandle=NULL; |
volatile MQX_FILE_PTR | ghFileSystem=NULL; |
volatile MQX_FILE_PTR | gphSDCard=NULL, gphPartition=NULL; |
void SDCard_Init(uint32_t temp)
{
bool | inserted = TRUE, readonly = FALSE, last = FALSE; |
ghComHandle = fopen(BSP_SDCARD_ESDHC_CHANNEL, (void *)(SPI_FLAG_FULL_DUPLEX)); |
_io_sdcard_install("sdcard:", (void *)&_bsp_sdcard0_init, ghComHandle);
inserted =1;//!lwgpio_get_value(&sd_detect); always inserted
for (;;) {
if (last != inserted) {
last = inserted; | |
if (inserted) { | |
gphSDCard = fopen("sdcard:", 0); | |
_io_part_mgr_install(gphSDCard, partman_name, 0); | |
gphPartition = fopen(partition_name, NULL); | |
_io_ioctl(gphPartition, IO_IOCTL_VAL_PART, NULL); | |
// Install MFS over partition | |
_io_mfs_install(gphPartition, filesystem_name, 0); | |
ghFileSystem = fopen(filesystem_name, NULL); | |
//LogFileOpen(); | |
giSdCardReady=1; | |
} | |
else { //never closed | |
} | |
} |
}
}
In the Main Task, wait until giSdCardReady=1. Then call LogFileOpen().
uint8_t LogFileOpen() {
int error_code=0;
MQX_FILE_PTR fd_ptrWrite ;
fd_ptrWrite = fopen("a:myfile2.txt", "w+");
}
fopen() opens successfully. It works.
Because SDCard_Init runs at lower priority and the SDCard is always inserted. So the task really runs only once. for initialization of SD card. So I call the SDCard_Init() as a function in the Main task, instead of running as a task.
Then call to LogFileOpen() fails to open the file.
Main_Task{
SDCard_init(); //when called as function, the for (;;) is commented out, so it only runs once.
LogFileOpen(); //fails
}
That is the first question: why SDCard_Init has to be run as a task. Main() is a task, too. Why can not call the SDCard_init()?
Then I copy all the code of the SDCard_init() into Main task as follows:
Main_Task{
// SDCard_init();
bool | inserted = TRUE, readonly = FALSE, last = FALSE; |
ghComHandle = fopen(BSP_SDCARD_ESDHC_CHANNEL, (void *)(SPI_FLAG_FULL_DUPLEX)); |
_io_sdcard_install("sdcard:", (void *)&_bsp_sdcard0_init, ghComHandle);
inserted =1;//!lwgpio_get_value(&sd_detect); always inserted
if (1) {
if (last != inserted) {
last = inserted; | |
if (inserted) { | |
gphSDCard = fopen("sdcard:", 0); | |
_io_part_mgr_install(gphSDCard, partman_name, 0); | |
gphPartition = fopen(partition_name, NULL); | |
_io_ioctl(gphPartition, IO_IOCTL_VAL_PART, NULL); | |
// Install MFS over partition | |
_io_mfs_install(gphPartition, filesystem_name, 0); | |
ghFileSystem = fopen(filesystem_name, NULL); | |
//LogFileOpen(); | |
giSdCardReady=1; | |
} | |
else { //never closed | |
} | |
} |
}
LogFileOpen(); //it works
}
I don't understand that why in the Main task, SDCard_init() (as a funtion) can not be called, and LogFileOpen() fails. and if the exact same code of SDCard_init() has to be embedded into the Main Task in order to make LogFileOpen work?
What I have missed?
Thank you,
David Zhou