嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, K. d0 \, h. n$ e0 i+ _7 _1 ]$ y" w" ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ T) \% D) W+ w5 O7 A7 ^: G! t#include <unistd.h>' _3 t7 p- j1 p' y0 \1 B$ E7 D9 b
#include <sys/mman.h>
9 f5 s3 m) j) |( \. R: d#include <sys/types.h>+ O' I8 [, `6 W9 `& s
#include <fcntl.h>0 Y( ^% Y# f) _! {7 c

, ?9 f0 r7 [6 `5 X#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 ?7 Q: z/ a0 {

6 O, y( ~0 H2 ntypedef struct2 X$ x9 o# }, i6 j* T
{
* g0 p" P+ s& n        unsigned int a;* i! N, P: P, M
        unsigned int b;
/ z  T, w, m$ L        unsigned int packet_cout;
" u0 f+ R! _6 W+ E7 }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e6 Y" V7 ^# h+ F8 ^) x
8 c5 H1 O) Z+ E" tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ t1 k; X+ W  B7 n( _, @3 n
unsigned int count_copy = 0;
" h. i) r, X% f
% B( x$ g+ J8 D0 `5 B( l# i: i! Z2 H3 M
int main()) p% X: f5 e9 H9 t0 B7 [( a
{! \) d" w- j2 p- t0 s5 Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! c: h; Y4 d! `1 [6 z3 b* O" ~        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ R2 a: s: @. j1 {/ c9 Q; _
, }* F; y1 U8 r/ }
        while(1)5 Q8 {% h" c5 u6 c1 c
        {
6 S6 D1 R' l$ V7 X                read_MSG_buffer(pshreRAM);. {" U3 [. z3 C" B# T5 R: L
        }                6 c3 P+ L' i8 @8 A
}3 @1 u+ y2 r3 i/ Q8 F$ ^3 R

: o, K2 `" n! P& z' t' Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 {8 n0 ?/ m& M8 L; I{' R$ ~9 t# I) {
        RX_MSG_PROTOCOL buf;# ?% c& M+ Y! |) \/ ]3 a* p
        
) v; k: D  D4 i* E: O        buf.a = pshreRAM->a;
; _) E; X3 e" a" C" m# ^. K        buf.b = pshreRAM->b;
% W; h3 b* ]; P& C1 l/ s        buf.packet_cout = pshreRAM->packet_cout;$ I; d5 W6 L0 a
        
3 A# H  d2 _5 _  ?; y# \6 S" ]2 r  g        if(buf.packet_cout != count_copy). j) v# y  x0 ?5 C
        {0 V# J) f2 E) I, J% Q/ m
                printf("a is %d\n", buf.a);) _- t( ?" i2 Y9 B3 U
                printf("b is %d\n", buf.b);4 x+ ^1 K! t, J( }
                printf("count is %d\n", buf.packet_cout);
0 T9 V  c9 Q1 r' ~/ G- C                count_copy = buf.packet_cout;( a1 \5 X  |# f- ~) T
        }( u* O% f& n$ Z, V5 ^
        else3 f' c6 c4 e6 K8 B
        {6 Q5 y2 ^6 g, |8 j) n# v
                printf("No effective message!");2 q4 Y: @- @. ?9 [. S" G/ K
        }$ }! g" l# V5 `- @( D9 D, C4 v$ b; D
}
$ y; `8 w7 o7 F% H
! x# D6 {7 f% U, n
2 P3 ^# O+ n% H! r$ F( L8 L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 p  d: P! c6 f* c
使用下面代码,对内存使用了mmap函数后:
' q8 j, D6 v( G. h3 P/ |$ V#include <stdio.h>
% @7 d0 @9 [4 C/ o5 P#include <unistd.h>
8 s. ]6 `5 }! [: P1 j+ _9 L#include <sys/mman.h>
& E8 n) a4 }1 p( i7 D5 [#include <sys/types.h>- d( ]0 k* y  ^8 g" \4 M
#include <fcntl.h>
0 P) d; D6 Q, D6 j+ E5 x
% q7 F7 t" X2 a- X0 C& b! @8 }#define SHAER_RAM_BASE_ADDR    (0x80000000)5 n! v/ r( R9 y; Y
#define SHAER_RAM_SIZE         (0x20000)   
7 v1 I- J6 M; f* W! t7 N) x( y# A" Z8 j% J5 l
typedef struct
$ ?9 E; h& b0 y2 m{% l& U1 j* `+ j3 H
        unsigned int a;
" P. @5 }8 j( `2 `' p6 J        unsigned int b;! _+ g" q, O3 V# l% w. q$ N0 U
        unsigned int packet_cout;
; L; j3 {& u% N+ G7 L/ |3 H6 N2 K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" X5 _' R; q4 J  w6 X4 c6 g
8 T% I) ~5 ?( K
void read_MSG_buffer(int *baseaddr);  S' |6 ?1 X; B/ o7 X
unsigned int count_copy = 0;' h; N) h7 N# E4 ^" k

+ m, h) l2 i) s( Kint main()
/ n! v( B7 ]$ \! z8 H, N! U{, \9 ~# F8 c5 r) Y7 ^9 G
        int fd;0 z9 k, G# w  y
        int *mem = NULL;
% v" N, [! @, N5 r) R" w# W& p* {' g, {
        if((fd = open("/dev/mem", O_RDWR)) <0)/ N8 `! A' f5 i$ z3 P* o( s' C
        {0 `5 b# f" r9 Z. o+ a8 |$ B6 u
                perror("open error");" j+ I. u4 B: Y% g' b
                return -1;8 q5 e2 \& Q4 }9 r; L- n
        }1 L. j' ?; R& |0 p
        ; s  W; M( [$ M& J: [: D
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) L- |1 x+ @3 m8 E5 W: V2 q' `5 t4 G- I/ N  K( W3 R
        while(1)
( P: Y9 D, l5 k4 W        {
0 Q+ U6 ]6 x4 e/ E' j" t                read_MSG_buffer(mem);. s# q7 u0 z! E
        }               
# x8 p7 n7 k' n# k  G% H$ X& M}, E0 U$ g! g7 A& T# e- z" {

* @6 z- @9 i9 i) s( V/ hvoid read_MSG_buffer(int *baseaddr)
7 L7 Q+ H: t$ w- \{6 I3 }9 u# v. \/ ^& F' S
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, Z) V! ?( o; O* W* P% k( A
! Y# d0 s& n$ h$ ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! }. a6 Z/ Z, p! g% Y4 j

' v. P2 |: h* o2 S/ z! g5 T' I        if(pshreRAM->packet_cout != count_copy)% U4 e- d5 z4 Y2 L' F
        {
4 h/ g2 ~- q$ q9 v+ I7 j: c' w                printf("a is %d\n", pshreRAM->a);9 X: Y  j- D9 x" [, T1 M. }* D
                printf("b is %d\n", pshreRAM->b);" @+ o4 S1 `2 J( j
                printf("count is %d\n", pshreRAM->packet_cout);
1 F( |- V  F' E7 {; h7 d                count_copy = pshreRAM->packet_cout;" g& p8 v4 M: g7 {
        }4 a# X; ^2 Y, s1 u5 y
        else
. O: c$ o5 k2 J& _        {
5 [# k  |% m" {' B                printf("No effective message!\n");. r1 m: }2 l0 v/ \7 I
        }2 |. D5 F+ S* C+ V
}
2 v( W) O' a6 k) P) D) Q# a% g# ?* S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. C/ F6 E0 @7 n/ W/ t7 h  C% a4 \; s' e3 C* ]
$ b& n# P# m2 ~! ^. \( Z3 t. W
7 J& W( t' e4 f+ H
' E& V' M" s: m3 T6 O5 v0 l% u





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