嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 C( d2 E+ G; }! N  f2 ~
+ ?( ?# ?/ J: IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( z/ P4 t' x- T4 H9 Z#include <unistd.h>* l$ E' ?" o# Z) V, b
#include <sys/mman.h>
( _$ f! p# V, `- S#include <sys/types.h>
, c2 E! c& M0 y; Z#include <fcntl.h>
/ M. j4 @1 m0 ]8 Y
9 }* M# ?8 Y6 G8 z#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" I$ B# I- m. F- x' N1 G) x. M7 \& u+ W  D2 p. a
typedef struct
& ]  J- j# k7 z3 X+ ], ~{- @( m$ |  A) d
        unsigned int a;+ V3 c( N7 h6 J
        unsigned int b;
0 o) _: g" @3 U# v7 V) O6 n- E        unsigned int packet_cout;
" G& B' N" r8 e. K7 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 G. l/ ]2 }( D: w3 a3 Z. [0 T4 R5 U) ^  n: {$ H6 y7 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# n5 C7 v/ H* @' u: Z. [
unsigned int count_copy = 0;
  W3 e7 s4 w* ^. U# Q9 a: Z: w. C/ k# T8 R" u4 D: e* t' z" p

( P! v& g' l* g3 o+ D" r! }+ }int main()
0 O: {( ]$ K1 J( }! U{7 T! b' S) W! J- H( l/ {- D5 T% A4 D, Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 c; J. M6 R8 G& a
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ C* r- Z& L" N) }5 b3 t- l
/ k7 h  `7 C) K5 V) c
        while(1)% X2 L6 B1 a, F4 ^
        {
/ ~  c; S) N. |( k+ T$ q0 R5 |0 X- m                read_MSG_buffer(pshreRAM);
" Z% Y8 f2 m6 ~5 F0 F( a3 d0 ~        }               
2 n5 }4 g9 N, Z' s}3 T% X# }  ~* V
; {7 I# x$ Q* G% n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' I5 @; ]  j: e# P0 X1 B{
1 g+ C4 V+ F3 {6 `9 ~. H        RX_MSG_PROTOCOL buf;
4 U1 F2 |- G0 i+ ?+ A0 Z        
, f1 v7 V! b. Y, s/ }8 N- V0 C- r        buf.a = pshreRAM->a;
/ z$ q; s) `* P2 S2 p( K. n1 s        buf.b = pshreRAM->b;
# I% ]* G" s0 q( p  |2 v) y9 p        buf.packet_cout = pshreRAM->packet_cout;6 r# k9 {5 H( d8 X+ s: x5 f% H9 b
        
+ N) s5 b$ ]2 m4 O' r        if(buf.packet_cout != count_copy)
/ m5 l  i+ V+ U( |        {
6 P4 d# X6 v9 O% j                printf("a is %d\n", buf.a);
, v1 R6 E* T1 Q. V% u( \) Z. g# {                printf("b is %d\n", buf.b);
/ k: D3 r3 N7 e: U$ q6 \                printf("count is %d\n", buf.packet_cout);3 s: K- u/ i' H( b
                count_copy = buf.packet_cout;1 Q- m! G7 D1 ^" h: c8 i2 R) L
        }# B, E. r7 q, r2 T9 E
        else) p, d- s. ?) H8 C" X* N
        {/ ~. D6 s8 K4 n' k
                printf("No effective message!");7 m  b( S( Q8 I  e1 c3 o
        }6 N1 U' u+ Z5 \. K. k! e$ b# M
}3 L8 |5 Y& u. \* R4 f; b4 I% \
, J- v/ O8 {% ^2 c

8 H. G/ B1 a$ v/ _" ?( }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- [* `: K+ [& B* V使用下面代码,对内存使用了mmap函数后:; u" e7 Q2 P, h  P) Q
#include <stdio.h>! T  f7 Y5 b5 L7 b1 Q( p
#include <unistd.h>
0 _" k" `- b. ]3 W# D2 O#include <sys/mman.h>/ i% ^* n4 x( X. r
#include <sys/types.h>/ Q3 @) n- B. p9 t% X, k5 R' ~2 {3 m0 n
#include <fcntl.h>
5 C( f8 _# g+ H. v; h' O
' }( [% N* d+ [  ]/ X- ^* J#define SHAER_RAM_BASE_ADDR    (0x80000000)
( j- {1 ~1 ?+ ~  M7 h) j" h! [#define SHAER_RAM_SIZE         (0x20000)   " j2 {1 x6 |0 b+ x7 Q
: n# X9 N6 D9 C  _( V
typedef struct
# C' _# g7 V. L  Q* u{; @, V) [2 J- y. y
        unsigned int a;
( F$ C* r+ ^  |6 G1 g! ^        unsigned int b;
# n$ O/ \4 A6 S2 Q* e1 u  W        unsigned int packet_cout;
* K2 c0 v1 P9 q0 u, E+ C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ [( N; `% t* ^

' ?2 F: s5 W5 P. [; p& m3 i' K4 Avoid read_MSG_buffer(int *baseaddr);
& s: N" c2 y2 R1 p  D, x" F' Junsigned int count_copy = 0;" ~5 ^6 Q2 ^, g+ d& V
: q) r4 f6 U5 j0 Z& t9 L7 o
int main()
9 `: O) H% I* [0 O/ Q, N{! Y7 Y( ?6 _% c$ s+ s
        int fd;
/ m  ?% ~$ e3 q        int *mem = NULL;
4 C4 a- X8 ?* r8 i/ y! K* k  i% J- A) h$ s; G
        if((fd = open("/dev/mem", O_RDWR)) <0)
% E8 q7 o9 G% p        {; @: \8 v4 i7 P7 E7 N1 I
                perror("open error");
& @: [$ o' O# t/ H1 ^, v" @* v                return -1;. U  ^& A4 V0 I# O
        }+ ^1 A& `  E( i& J) {
        
+ ~2 i2 K. }- {7 A! g% u; ^        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' n: @$ J! x1 h
3 v1 j( H! m5 T: ^7 h        while(1)
8 H3 X5 i# ~! L7 A) q        {8 A  Q4 Y0 I1 c1 y2 q, J- d
                read_MSG_buffer(mem);. z0 m. q9 b1 L* L
        }                # ?% q1 [: l1 W! D* K9 X( Z
}
5 e9 _; M: K* l. Q0 w6 B
/ S* d+ B6 m( A/ d! q! |void read_MSG_buffer(int *baseaddr)
. h8 u6 q( Z0 i& P& h3 M{
0 S9 y: H' D3 }- f9 N, H: F9 {        pRX_MSG_PROTOCOL pshreRAM = NULL;( A. _2 o7 {% H4 a2 A& x
, W$ d2 C1 n& |& P+ v
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( b0 q8 a& e$ _, Q

( }: K9 d2 `! x  }! {( E% u        if(pshreRAM->packet_cout != count_copy): l2 _" t8 x! j; P5 _5 a
        {; D# ~) m+ c. c" Q7 y
                printf("a is %d\n", pshreRAM->a);
2 H$ d3 }: o+ ]& T                printf("b is %d\n", pshreRAM->b);4 b5 L' q+ K& z7 m2 i! l
                printf("count is %d\n", pshreRAM->packet_cout);7 Y6 g- ^  G9 }7 Y" |) S- |
                count_copy = pshreRAM->packet_cout;/ J! Q9 k8 J. u- q2 ~/ v5 P' U6 C& x2 L
        }
: W! C, V1 d( r        else" \( `, F0 b) o; I' v, U
        {
8 r# R: [0 B: x. r* S  V+ r                printf("No effective message!\n");
& S$ h+ d& N* Y1 H) Z        }
- q% ^# O  Y2 {9 |0 D" O}! M. A8 J9 u, L

9 H( m$ C: ]7 z- T# v# g2 ?) r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 T! Y7 S3 C$ R7 e. `8 A  E
! b2 i- T4 o+ K9 F1 m& v
6 d- r0 [; Y% }# H; _
7 R: e$ [1 N4 W  s, w
4 ^# \; g7 {  ^





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