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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% I( H  P/ j. P6 ?/ m0 @! }* ?) Z/ W
9 X$ e* Q/ O8 F7 WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 M' z; D4 ~6 `& ^4 ]#include <unistd.h># h6 i+ j: `8 t/ r
#include <sys/mman.h>
) a/ o% D1 |. k9 z. {#include <sys/types.h>
% B) i' ~2 K. |2 V8 s7 q0 {5 x' C#include <fcntl.h>, E( z. j- x0 d5 `
+ ^: o, C8 D5 Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 R$ S! m) F. \* L
! s! z; `9 D2 a  m& |" J7 t7 y, [typedef struct9 D$ V' R1 k' ~8 X
{% ^6 O) i% a. D
        unsigned int a;  l) s! j8 X8 P) Z9 S
        unsigned int b;5 `9 X! A' z( Z& T( B9 K7 M7 `4 m
        unsigned int packet_cout;& A/ [- `: E" E$ ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" s. i/ K+ n) X, `3 P6 R% v+ s: a
! p9 t9 a1 ~  W. I+ g; {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! ^) Z  T/ @" t9 ^unsigned int count_copy = 0;
9 ?  p' M" f8 L- Q2 s: f4 j! S$ e) ?+ \  ?; h& V( x

, p% L( U0 `0 {int main()* V8 r  b" R7 t8 c4 K3 |
{7 X; H+ u. L- J# u: q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ w1 f4 `6 U$ ^6 X; [% x! B        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) r& n$ E. c7 V

7 R( K" I3 ?$ a# `( X3 `        while(1)
% A) q, n# Y4 u  G; M0 v4 j4 \, ]        {/ \! X1 n8 C& x2 p- U$ o* K( I
                read_MSG_buffer(pshreRAM);9 R3 Z. Q$ H0 o: H
        }                9 t7 ?4 g* Y- V6 [8 W5 P$ O2 x3 I
}) u3 d+ F" |- u9 E% g

1 S& s! Z. j8 e2 ]4 T: V9 [+ ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 b- \3 r: I8 F6 E3 ^& }{6 N5 b% s, E4 B6 N1 N# P
        RX_MSG_PROTOCOL buf;
& Y1 @2 V5 g. M" K# N( e        
7 h, s  |" V" Z. P2 q' h, v) S        buf.a = pshreRAM->a;
5 ]0 b' Q2 {7 c( M+ e        buf.b = pshreRAM->b;9 c6 V; L% F9 N2 t! l: s/ d% }
        buf.packet_cout = pshreRAM->packet_cout;  r; D, t) u" U7 Q- ]+ Q' C
        % l9 x' f  @: b+ w3 h
        if(buf.packet_cout != count_copy), Q- d8 H7 @0 N! S  E# V
        {9 Z/ W/ }% p  u0 x8 T
                printf("a is %d\n", buf.a);( s- B+ F. ]) H: y( o) x  W! s
                printf("b is %d\n", buf.b);
1 E4 l* n; ]. v                printf("count is %d\n", buf.packet_cout);" \. {% I) Z0 c6 m4 T
                count_copy = buf.packet_cout;
' h1 _$ s. P9 U- |8 h; b        }
3 j6 t7 `( [( d8 ~& n2 R        else
( c8 |' Y- o" n        {8 z# ^' v3 Z& u% V
                printf("No effective message!");
& h! |' x' K( s$ g7 |8 @/ H0 U        }
8 I1 e! N3 j% k}
# T5 S5 ^6 i$ H) w9 D# S* L' D7 l% A. `0 U: q, l- O* q0 \9 \

8 X0 U( ?% l8 `9 A# G但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 V" S$ N7 a7 U& i" J' L1 |使用下面代码,对内存使用了mmap函数后:; h3 G) b+ b2 l9 E
#include <stdio.h>
. F- |- k) J+ e2 H& n2 s#include <unistd.h>+ A- A9 z3 e8 x( t! d! S
#include <sys/mman.h>
1 A; a3 E4 m6 I8 o- h$ H#include <sys/types.h>, ~' t+ J+ S% W. Q/ S
#include <fcntl.h>4 }6 Z- p/ d* h" M" ~, ?$ |
* {5 j! U$ {  A! L8 P
#define SHAER_RAM_BASE_ADDR    (0x80000000)0 K) s5 M4 t" r! a$ o
#define SHAER_RAM_SIZE         (0x20000)   
6 }/ [: ?3 Y) ~0 l$ l% `4 v' f2 V& v( d7 t7 p. ^" V0 i
typedef struct
1 {# c. Q0 b  q% W& J6 B{
  I( W& K. C- `4 r        unsigned int a;
) Z" R4 w9 o+ A" \        unsigned int b;) g* o* X$ `& ?; J7 d4 S
        unsigned int packet_cout;
/ v  A! n3 o9 A  [2 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ r  H8 j- l- d9 |' S0 ]; f

8 C! q% C; `4 m( ovoid read_MSG_buffer(int *baseaddr);
5 m) x; X) I" H" P; hunsigned int count_copy = 0;
" T+ ~2 i+ Y* f  w2 T( B
3 H6 s* q( b" q7 h  L* hint main()
7 z/ `; h* Q7 q3 ^' E& |- B{
; [# q2 E! ]) ]- R# }! G# i5 C, b; h        int fd;
3 K$ y$ j3 j% i$ v$ G( I) t        int *mem = NULL;
" T# l" [. f4 h. R1 A; G6 y6 k
& d8 s" F0 w) I0 z        if((fd = open("/dev/mem", O_RDWR)) <0)
: i8 h9 X# r1 ~0 @" H2 Z$ ]- X        {
% ]) A4 b( S+ r5 s" x" `  R2 }                perror("open error");: u8 Z- q, n* {3 n2 P& `5 P- c
                return -1;
9 r# j* q4 r9 u4 \. }: e/ _: \        }5 t! A! G* k6 M/ e  `
        7 z) b1 n& O  ]4 ~) n( l
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- H6 n+ X& ]4 V0 G8 L% v+ ]
' c. T: v: j/ L# Y' `' j        while(1)' u; Y9 e% \% _* K
        {
4 I$ \# J& |# @! ?8 A# s# c                read_MSG_buffer(mem);
) H* Q5 ]! h3 _        }               
- t" y9 g; e/ Q0 U% D8 w5 d}
1 d0 S6 I% b( l* @2 d8 G$ z) H" [3 s  k
void read_MSG_buffer(int *baseaddr)
5 Z! C# ]3 ^8 N/ B! i{& s% L  q! H  {/ D3 H& ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 B8 a& G# N# D# t8 A* l; g2 h, S
6 q$ o& i7 _7 ^        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 x3 u, T+ ~; e8 Z. P) r% _, {
+ B" P) E0 h6 ^! V7 p& J        if(pshreRAM->packet_cout != count_copy)) X7 C/ c$ p3 }. B* L
        {( t) j, o9 g3 B' U* }( B, U
                printf("a is %d\n", pshreRAM->a);
" {2 M5 {7 k5 k: S; k                printf("b is %d\n", pshreRAM->b);
( O/ ?1 m0 [/ l0 c- }( k, ]                printf("count is %d\n", pshreRAM->packet_cout);
8 U+ o- |" x5 m. I                count_copy = pshreRAM->packet_cout;
8 p: L# k2 K* ^4 S  R+ H( C9 \        }
* `% ^  A$ n, T# ~* ~8 T+ n        else% {0 _  Z- v8 U7 R
        {" S- L0 s7 @) k; B
                printf("No effective message!\n");
" s# M4 |! D9 N, L        }
5 Q# W) _' S7 w3 S# c0 @}8 d5 l4 O8 W; m" y7 B9 [/ L

7 R1 N, k/ L4 d+ k: Z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 u3 R6 t. _* B! y' L5 Z4 p( ?. A/ d: n0 K: a( h

7 l6 M' N8 f7 _1 R0 u8 O
( o; T1 ]) a* G* F  b/ c# _7 t
2 d, T) `0 V, c; E% X7 c3 T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 02:33 , Processed in 0.046224 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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