OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) V: T2 S( n4 |5 _! e7 j4 {/ S
0 M9 d# U, [% h8 o4 M9 ~, j( }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 |3 r& w/ B+ [% N#include <unistd.h>: d! q! P7 z& l, r' B
#include <sys/mman.h>
; p; z# N. P2 K# M2 Q3 w$ r#include <sys/types.h>
0 w7 p! e8 Z$ \# \, w#include <fcntl.h>( u) `. L3 R; {5 T, p
" X  p7 }" [* K- N/ J& A# R' ~9 }- y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 r$ ?* v5 U. E. q+ e; e- {% i/ g
typedef struct! j6 C3 k9 Q+ s
{
6 S; [" w  j4 D  w( ~        unsigned int a;5 Z3 |  r6 |: S, p- U# t
        unsigned int b;
: g3 f$ P: S2 i4 v( f6 K        unsigned int packet_cout;5 s4 s' B8 q# C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, f9 j8 L6 m, P) l" w- X3 p. |8 j' r; e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 S+ D* J: b7 l+ b" Q. bunsigned int count_copy = 0;
+ L! `5 ]2 W6 f0 D# Y8 w, [! \: j  s
7 f1 x  r# _( i* y/ l6 O: n; p1 I5 \" ]4 b& g1 \/ K
int main()7 B1 l6 M1 Y" y3 z. R; D$ A% ?8 x; v
{
* D; R% j* Z5 r6 X* t0 c        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 M, _$ O4 @1 u) a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ d  R, }. ~4 h0 \; b

+ q: k2 h7 {7 k- N4 h        while(1)
! f' N8 p: P: p! v        {
' A% L# z2 A6 ~8 p( e                read_MSG_buffer(pshreRAM);1 X4 d5 u, a: d# _3 t
        }               
7 r/ l% k/ m$ T1 z}1 e* P" Z- B" C

$ c6 A" \" Q- P0 U8 {! Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) G8 `# i$ \' s{
9 R' Y7 P% K- w5 Y        RX_MSG_PROTOCOL buf;
$ _4 j7 N3 X4 r; h        
9 T* h8 u1 ^, {        buf.a = pshreRAM->a;
' O! g' u% I" ^8 B        buf.b = pshreRAM->b;
5 D. S3 t5 B( ]        buf.packet_cout = pshreRAM->packet_cout;% m, t$ S! ~+ l% G! l1 {
        
' i% u& Y2 {( Z! m; l: c        if(buf.packet_cout != count_copy)
% v' ^6 C- T! O% d0 d        {. \% J) N' f  H9 C9 t
                printf("a is %d\n", buf.a);
1 {! f' ~, S7 ?" t; }  _                printf("b is %d\n", buf.b);
' A6 I2 Q0 x- m                printf("count is %d\n", buf.packet_cout);7 i# k" l6 W2 P% `1 T
                count_copy = buf.packet_cout;
% f0 `* T0 P" Q! U& C        }
9 S, K+ |5 R6 d! E+ O6 F6 I        else3 m, {+ _" Q5 M8 K7 w5 T2 e
        {2 Z3 P! \+ k9 ~! S# O
                printf("No effective message!");
' ]& O2 w7 P$ T        }- X; u: A2 y' Y  Q! t4 D* x9 W! t
}
; o  N0 x3 Y& J! U( ?. |
7 _2 m7 v% D7 x" X" o( [! D5 w6 R( O2 x) \( \0 q/ T" ]/ e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, b: K2 a+ @8 N使用下面代码,对内存使用了mmap函数后:
1 J  p" M. j) C% H: g; E& ~#include <stdio.h>- U  W1 r! f0 y
#include <unistd.h>
( y8 M/ c2 }0 G% m' Q" E4 m#include <sys/mman.h>% g) X& w* G' Y0 h9 L( N7 ]& U* _
#include <sys/types.h>. A+ n" r) `/ E9 ?1 ?& d$ B2 k6 J
#include <fcntl.h>
2 n  b  U" p) K: {* e8 z9 j# v
0 u3 S* t+ E8 |2 e" a3 m; _#define SHAER_RAM_BASE_ADDR    (0x80000000)
. y4 H4 B& G1 a- R" @: @" X#define SHAER_RAM_SIZE         (0x20000)   
4 Y2 ^# C' ~, V9 V2 N$ p" x4 \: w" B% t( j# Q
typedef struct' F3 p! E- Q$ c
{: h+ K4 \6 b# v1 P  `
        unsigned int a;
+ F" B$ X" t, Y- y# G        unsigned int b;
# U$ U" m1 R  P3 _( r        unsigned int packet_cout;
2 _3 O8 H4 W: E' a7 t6 Q3 z+ ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 c3 d9 N6 }2 a; n: K" |9 z1 l! {
void read_MSG_buffer(int *baseaddr);
& X3 d- h) N0 [& {. e- w' K) V0 ^unsigned int count_copy = 0;6 S% h, l' g' e, P, |" }% w
  n9 F1 A% V0 [/ f( l2 m
int main()  K* l  k- P) z" a$ ?
{( ?( l1 G8 O0 H; A
        int fd;
; w  j/ ?3 F1 b        int *mem = NULL;! _, e1 _1 l1 g

1 U: j6 y( `# q$ J5 Z' ^2 x- \        if((fd = open("/dev/mem", O_RDWR)) <0)
8 E. F2 U/ Z2 i        {4 P- X4 V5 a1 X( S8 B1 U* M! q, H
                perror("open error");
, h& H) ]7 b+ _7 `. f                return -1;
5 D* @, Q5 f  U# [4 y% ~% \4 B        }
: g/ D2 k/ o& Y8 C        
8 m; r* U9 |. [        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& {' O$ t1 \8 Z( _
. P, i, \. i  h* S7 U& K, X
        while(1)$ i, }( h" l% d9 Z0 u- z# ?: |& r
        {, A& }, W  O9 d% y* q6 [( {
                read_MSG_buffer(mem);" C+ `. M/ M1 x2 g4 W( F; h
        }               
( U) i% a( P" d% Z8 j  z6 Z, {/ V7 \}4 Z  T5 z1 _9 U
& B: C8 c: G' J; l0 F4 z
void read_MSG_buffer(int *baseaddr)( t+ J3 N9 ]0 J7 [7 n8 k
{# s2 q" O6 f( d% f* x. }7 {
        pRX_MSG_PROTOCOL pshreRAM = NULL;  b; ~; J. j1 W- j  I! b

. `( r* k. \- J+ w9 Y) Q; ]# M0 k        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ R# }/ u! Y+ o  t+ X. Z  s
9 q8 F% v# r2 g9 B2 l1 p* V
        if(pshreRAM->packet_cout != count_copy)
/ x7 u& w, R9 Y" c6 N        {  c& U, B% o3 r. S- n
                printf("a is %d\n", pshreRAM->a);: F8 y9 n$ d& j2 {# q
                printf("b is %d\n", pshreRAM->b);1 O+ ?- u0 C, V: w
                printf("count is %d\n", pshreRAM->packet_cout);9 d, Z  S; {1 P. R( U
                count_copy = pshreRAM->packet_cout;
. s% x7 u) Q/ C7 O# w$ |        }1 u+ F8 y( t1 H
        else- h  @! r3 q* D' G/ F. I! a/ ]
        {2 m3 N1 z1 a5 q
                printf("No effective message!\n");/ n: B9 W. x0 s* {# A( \: Q
        }) J, K# h' I+ ^' `
}
) @% a' B1 J  C; }
: q3 H8 y' I4 I- S! ~7 k没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 I" G2 r0 M4 r/ I% E/ N: P3 @6 h8 d- h. }. V- {* L: O; V; \$ W

% C: a' B: Y1 t1 @: k9 o6 A+ D1 ~/ d1 f

6 Z5 B5 D! w8 _. s& e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-16 09:17 , Processed in 0.040186 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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