OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5156|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " [9 a" a; s( z- ]
& S* V" g9 a$ e" A0 }* b0 c' z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, W8 s0 v/ g( o/ L/ Q9 }5 y! [: E#include <unistd.h>, j$ e" }: t0 U2 t
#include <sys/mman.h>+ t9 C$ p9 I: A& ~& q) z1 v
#include <sys/types.h>
0 N1 ?: Y+ J; q* K: t#include <fcntl.h>
( z5 j: ?3 \( X: L# u* U% q  Q6 o! j( B" l+ o
#define SHAER_RAM_BASE_ADDR    (0x80000000)   " i: s2 n0 }. `7 u' Z* V
8 Z' p( Z* _2 h7 i
typedef struct
" k2 f* n9 }' {1 ~( t{7 J3 B! K  ]$ E$ x8 b  A# N
        unsigned int a;
+ ^; s" q8 Z' h' W2 `$ |0 ^3 L        unsigned int b;7 f$ u  _6 d! P" f; |
        unsigned int packet_cout;
9 O2 N! o* m6 d# G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: ]1 X4 E8 R  q# _7 z8 F7 t& g2 X& }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( p/ V7 I+ G1 N; \3 w* Q8 h' Aunsigned int count_copy = 0;! b( W6 ~, u: s% l/ K

( f0 [4 e8 x  L. s* N9 @
! d) F; C' M' f+ a! n6 O& R+ Pint main()1 F" g, O6 `; |/ |) H, Y1 R. J. z# U
{; }' f2 P$ ?: W: ^) R5 R
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; e* d5 g$ ~8 j! J" V7 z0 N        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 m% R/ j. }# k7 T
4 c' @% Q' m8 K/ G9 U
        while(1)
! |) U; x7 h+ B4 J+ O. b" O* F8 R7 T        {+ Z- ^" S/ {& l- N) x8 X5 r. {
                read_MSG_buffer(pshreRAM);
3 ~% j1 M5 G' a& s, ~5 w* K2 ]$ Z        }               
3 M! N9 J2 C8 A) [8 _}
  A$ X/ ^5 S* [. {; n  C9 l% N5 s3 Y* t: E9 ^$ }: d) [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ G, S& A" H" c2 v2 w{1 s1 k  P/ }* t4 r6 I. A
        RX_MSG_PROTOCOL buf;
3 `/ q4 l9 y! H; p8 m: ~3 n1 s        
5 E( T- `! [2 C7 a! K; z        buf.a = pshreRAM->a;8 S3 ]: X& m% X" Q6 _1 ^) L5 M
        buf.b = pshreRAM->b;
, U( Z; O; W2 ^: X9 |+ A$ i        buf.packet_cout = pshreRAM->packet_cout;5 Z2 S1 M+ p& _$ @1 w7 R
        / Y3 J# B! o0 m+ v$ \6 m+ r* f
        if(buf.packet_cout != count_copy)
/ K# e! n' h1 P0 H6 j4 F: _3 r        {
% S$ W9 C, L. N& S! z                printf("a is %d\n", buf.a);  R5 L+ h1 Y+ s" l- X6 A4 k  K
                printf("b is %d\n", buf.b);4 g! J  G+ }. {8 H
                printf("count is %d\n", buf.packet_cout);
) [0 s) r4 y4 A% G                count_copy = buf.packet_cout;
3 Q- ~2 Z6 b, ~: y; y0 ~( k. _3 V        }% d. T) s. E" d( X6 V7 j
        else
2 U/ a- {* `2 d9 \/ A- [: k        {9 W2 B% x8 C8 ?' e
                printf("No effective message!");- a. C' [+ S( A% V# g: A3 G
        }. `0 S# D  N7 z% n
}
' u% h/ {) q7 I! ?$ O; @, W) O+ l, X  G) @$ e: W! s
4 \; S* z, T. g; U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& t" \  S/ h7 L- [  L4 w使用下面代码,对内存使用了mmap函数后:0 i: n) j6 X, B! S2 _  s4 ^
#include <stdio.h>- ?# N8 W! O7 P3 T
#include <unistd.h>
1 d3 J6 H* i6 n9 p, ^5 k#include <sys/mman.h>3 q  I8 q; K* L% g8 G: P2 u6 M" V
#include <sys/types.h>4 y9 s1 e/ ]& M' e+ N9 G$ x8 R
#include <fcntl.h>1 }% l# J" s: w# b* d

$ N; L( e0 K" I# d#define SHAER_RAM_BASE_ADDR    (0x80000000)& ]  V1 @) b$ [! F
#define SHAER_RAM_SIZE         (0x20000)   
3 l4 S- u0 U0 _, z& K+ H& Q& i! x* U4 J7 K) s, W) L: W7 J' Q" K
typedef struct9 C. x0 J4 j  F5 m) e5 T1 h! L/ a
{
7 s1 a% L2 k5 M( Z' v+ T' T3 m" s4 {/ e        unsigned int a;
& ], t7 \5 {9 I2 u9 L5 N0 W        unsigned int b;
/ _* e$ K2 u* c" [        unsigned int packet_cout;
4 {% N  _/ ?/ N. S3 Y" Z& o: t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 v! U9 S4 o) b  e8 y& h! ]( v2 Q

3 x1 ?/ r8 R; J/ Z7 Xvoid read_MSG_buffer(int *baseaddr);
1 _6 }; y7 X& L- {9 h, C, u) Qunsigned int count_copy = 0;
% w/ F+ B0 z1 f+ _% R" p. m9 t
  V- f9 S. U5 R" a  t, tint main()" q/ r: C7 Z' |$ A# X3 ~
{  l( b: |9 {# Y, G
        int fd;
% A$ ?2 y1 B8 x7 v- O        int *mem = NULL;
  K/ d3 L3 O3 i0 }! x3 o
6 m* A% {4 p$ h+ S$ K        if((fd = open("/dev/mem", O_RDWR)) <0)
- x% V/ |; E% l( Z        {
3 E* I( D/ o1 E. R" e! @- a. S                perror("open error");# q2 k! d/ z% b. q0 e
                return -1;
6 R# u2 R3 U, d. n+ q        }# j/ n2 C4 K+ W! q% @' R7 M& @% w
        % j. J% J5 x8 G& F5 ~: f" k
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ }- c, V0 p- V. G. V

% ^; [7 z% O& h% K        while(1)
7 E+ H5 `& C& @; X- k        {
+ a: R7 E+ q7 O" y7 Q                read_MSG_buffer(mem);& H: W6 H9 s: v+ \
        }                / o9 [5 @% J8 H; @+ m1 S
}; [  n  j- \; T3 t

, ?3 b5 h: X  {& Gvoid read_MSG_buffer(int *baseaddr)
% C# F' ~( f6 p+ y: f5 s{& [3 |& S2 Z) p8 J' k
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 a; Y; ]4 G) B* V' L' J: n9 f$ O! Q
1 r+ Q( g  m' E! U' g; J4 P
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% C* A: e4 e9 n! e

$ w  f/ d; L- Y8 o; p0 n- E" Y6 w# x        if(pshreRAM->packet_cout != count_copy)
5 I8 j9 z; Y: H* S7 q4 s        {) |( {8 Z4 |2 D3 q3 h: d6 g9 y( ?
                printf("a is %d\n", pshreRAM->a);
2 d* b& J7 g6 Y+ r, B9 q                printf("b is %d\n", pshreRAM->b);
" L* Z& Q0 Z. ^4 `% A! z                printf("count is %d\n", pshreRAM->packet_cout);
% V% H2 p: Q# w" @3 m                count_copy = pshreRAM->packet_cout;
( M* l% q5 V) o( ~* Z        }. X0 Y# L# `) E" j
        else/ j9 H& k/ d% s  s
        {
- S5 V: D2 }2 L! T/ \$ [7 C' \                printf("No effective message!\n");) k. Q9 w8 n3 k, X" h+ m
        }# q# N" T# A; N5 j; R7 y
}+ ^+ Z; Y, Q# ^: ?9 s( M: D4 Q

% U% X3 D1 d7 A5 K! @5 a, z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# }6 q. x/ N# ~2 Y; |9 Z9 W
" A, `% d3 F/ T" r! [0 B9 |
; @1 w4 Q- b; M2 Z/ S# H5 Q

% u" w: r- S" C1 o/ K
1 ^) f8 w+ {9 n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-11-20 16:46 , Processed in 0.043583 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表