嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 R7 q8 T: f9 T
7 L2 [/ c7 j+ r6 d1 ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 U7 R5 h, w- I; d: u" T#include <unistd.h>: k7 b$ k( I* F0 s" D0 |4 e6 Q4 p) e
#include <sys/mman.h>3 {. F, U& R$ j& R- F$ I1 {( ^
#include <sys/types.h>
. e) s! w7 W* P) S#include <fcntl.h>
1 K9 W% C4 x' V/ E/ t( Q( \4 E8 b
& \9 U& A( ~" X$ K8 ^#define SHAER_RAM_BASE_ADDR    (0x80000000)   / i8 w# }4 {- i6 @, W
7 {, }; X0 }% C. D5 \6 E$ B& m
typedef struct2 T- t- \) Z+ ]- W
{
8 e0 F* ?! J; V1 l. ^9 `4 X        unsigned int a;3 O  }' H) r+ f' F9 X3 R" @
        unsigned int b;
+ j) t" M* M& e, x; b        unsigned int packet_cout;9 j( H, p# F& m  h9 \) r) x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" S! `7 E2 ?# u0 |* I, y
9 L# G7 J) k$ O; |3 ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  U3 L$ |9 o& ?: l5 U
unsigned int count_copy = 0;
8 I8 y; O2 b! O
1 {3 u3 ]( }* J% r" a8 d! T
! ?2 D' ^" x" f0 Y0 i' T+ q1 N! R9 Sint main()
6 t! N( f9 F4 L0 r( ]{4 W( M. H! _# [1 e. C- c5 K* x. G
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! S; o" X! k, W. j3 c6 [        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- _/ l3 S! w+ r9 N; q
$ c5 A4 R# A9 T. r- Z$ d        while(1)5 S* b1 n: g' A& z8 e5 `
        {
. r  ]/ n/ L, L; t4 m/ f0 U: \                read_MSG_buffer(pshreRAM);" T& h' f3 {7 ~# U" P' W9 M4 `) w
        }                4 N" ?! o, ]# C1 I8 ]$ i
}5 ^4 L7 d+ |1 a6 [! |4 A

/ w; V+ s- e$ J6 ~+ Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& @: w7 q! J& e& e. R" y
{
' q8 B3 H3 k4 Q) U* L: ^        RX_MSG_PROTOCOL buf;, o% B3 l; |- r, r5 s
        7 W# ?9 C4 C/ l6 Y3 W
        buf.a = pshreRAM->a;
' d2 g( q9 F2 K- i% D        buf.b = pshreRAM->b;
- R' I9 Y+ g5 }. n* |        buf.packet_cout = pshreRAM->packet_cout;; e( O  }" q6 V
        1 e9 S5 e6 O$ ]+ x( p1 }% X8 V3 m
        if(buf.packet_cout != count_copy)
, K9 H0 x) {" f        {0 a7 n; X6 O: D( k* T4 E& a9 T9 L
                printf("a is %d\n", buf.a);" S1 r5 ^/ J3 |+ M/ y% q0 E
                printf("b is %d\n", buf.b);, M- K9 _- A. k0 Z6 L( c6 z
                printf("count is %d\n", buf.packet_cout);
( D" H& k# q3 a6 ?. o# L) m                count_copy = buf.packet_cout;
$ v' [  x5 b' i- d1 f5 M2 O- I) Z        }/ ]& m; J! Q- r! `
        else; U: C4 J7 I) _( S0 O. L! t
        {
4 Z3 e. s. m& _+ E9 i) Y* A0 D                printf("No effective message!");
5 b& D! d( g- z        }
- E% w" u7 q- ]5 N. C; l3 [}
' t* V6 z* C0 E2 x
7 n" K. w$ s: z5 l$ a$ S# ]  V+ l2 R/ k% t/ S( L$ s" Y# R* ?7 A
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 M  @; z" p! I
使用下面代码,对内存使用了mmap函数后:
4 Y  e# N. E! L" r#include <stdio.h>3 H" f  ~7 ^2 u( ]7 I
#include <unistd.h>( _& j! d2 e; X1 O+ r6 A
#include <sys/mman.h>
7 V* P9 R, x% o( J+ f, _5 B9 P#include <sys/types.h>
/ @2 C2 E2 ~0 Q9 Z. S; _#include <fcntl.h>
( @2 S0 o0 N4 h+ w2 n& d! {+ G9 B) N* ~4 _
#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 u4 {0 B3 }" b#define SHAER_RAM_SIZE         (0x20000)   ' r5 g4 b2 y5 j/ ?$ U
3 T) b. H3 b# K9 D7 h1 J
typedef struct9 ^! y7 m' F' L7 \( }5 k& p
{
8 ^0 f# ^6 K: K& R6 L( m0 ]* \. H        unsigned int a;
$ v: I" H/ r' {! K+ V- |        unsigned int b;% ^8 \) e% l3 j& [
        unsigned int packet_cout;" u# ?+ q1 P. y$ j3 A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 D2 f2 p3 g# H6 t4 S) ~, g, V7 P; ?% O" [/ [( W9 F# E, ?
void read_MSG_buffer(int *baseaddr);2 F3 ~+ R* {' }2 t
unsigned int count_copy = 0;
* j7 m7 l6 p( I) `" h# a2 ~8 ]- H1 [
: e! D! X! K! Cint main(); c1 u# }2 h1 n6 @* a* z3 j
{/ A/ j* H8 b  D0 y- S
        int fd;: q0 s% e5 u0 Y: k: Z2 ~
        int *mem = NULL;
5 o# g2 @3 G" s- x# S% g) `* g( a* W( a. A; q
        if((fd = open("/dev/mem", O_RDWR)) <0)* G, C/ ^* o" A& I# s2 E
        {# `# p+ r" I5 {
                perror("open error");( P5 f. {3 z" L7 Z
                return -1;
0 T6 s- T9 L0 x        }2 `7 L$ d% t" ^( m: J7 P
        1 F+ j- d9 h1 j7 I8 A% M4 ?0 E5 E2 H3 X
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 L' ^! t1 k+ K! @1 Q8 Y
- r" c6 u" G& J+ _( G9 G
        while(1)7 ?' ], a$ K% T
        {
5 _/ Y7 L6 A: `; x4 G                read_MSG_buffer(mem);
6 z$ O9 x5 u0 y2 B- A  ]9 Y        }                # O' n" Y( p  D: x; }
}
  Q4 K8 Y/ i/ t3 `. P
. ?5 Y( @4 ?6 T, kvoid read_MSG_buffer(int *baseaddr); d( v0 M+ N4 \# M' \
{
( i1 m/ G4 ^1 d        pRX_MSG_PROTOCOL pshreRAM = NULL;
( a; r7 r, Z# ~% y- k) ~: ]( L( p8 V3 S( G  B
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 W7 O) P, t" x$ T% l0 }) Z( p
: I6 K$ ~2 u5 [8 r        if(pshreRAM->packet_cout != count_copy)) e! J- g, H/ @$ `2 G
        {- {, R  y1 H+ e6 u
                printf("a is %d\n", pshreRAM->a);: E; _5 w* k) C# T* \; M
                printf("b is %d\n", pshreRAM->b);, O9 v" R9 R9 N9 ?
                printf("count is %d\n", pshreRAM->packet_cout);
6 \. o, J  h* g                count_copy = pshreRAM->packet_cout;
' ]$ ?6 ~* `% J8 F. e6 x        }
* y" ?9 q' X: N        else
! \& F) C" W1 L; a; I        {% Z. N& ~# ], H( z" ~" W) D
                printf("No effective message!\n");
8 N) r1 B3 L( `: c$ u7 H        }
& A+ ^/ q4 }: _1 {! M+ W; N* z}
  Z# `; [4 y! r$ f& ~- x: l0 r2 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' f) {% a5 z6 Q2 x9 \# s& g# G1 K& B

& Z% V- n7 z5 p7 V" t$ P) A; o9 T! m
1 j. M% p8 c& J

8 i+ Z- @3 C% b& V% H




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4