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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 {8 ]* l" f5 s3 R+ h2 c

; Z9 U% m& [$ W* w' L$ {+ [OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 l. p/ F: \2 M6 U, R2 s#include <unistd.h>
( ^$ h0 t  u+ {0 x- d+ `1 y% @#include <sys/mman.h>
1 o4 |2 r, t9 r4 |#include <sys/types.h>' @+ H6 n0 L* G8 s  T
#include <fcntl.h>3 K2 z% g+ N: L% }4 R% N8 @5 r: S4 N) S
2 d, i/ r, \* G  H6 T+ Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 j% ~6 e1 l3 V9 k( k: S1 d  i. U& M1 R' r' S3 h4 `. s
typedef struct- L; j, Z: M- `6 l/ g' O
{4 B8 u! x2 b1 k' v3 e! \
        unsigned int a;* x5 C/ H, l6 g$ C2 W: A
        unsigned int b;
! R1 i9 a0 ~8 D3 N% o        unsigned int packet_cout;
1 o! U; h2 l) x7 w0 d; x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' D; O' S, k$ Z, P3 l! A6 ~& W/ N7 E/ {# J$ [9 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  @$ {- F  g, f3 }& h) e6 Qunsigned int count_copy = 0;
" Y) j4 b, _* r4 B7 ^$ I4 E/ u
2 z5 S3 ~' n+ S* d8 i) p
" ?' o: k, o/ h/ r( `int main()& Y4 }, N# p; P" [" l8 _
{
: u2 M# w2 q0 r) l        pRX_MSG_PROTOCOL pshreRAM = NULL;. r6 P$ m: x0 I  J' @) q6 j  x7 s! i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 ]: I7 k9 ]3 ^  Y9 c7 O& r- M
6 u* ?) i: q6 _- z) |! \        while(1)+ ]. L( {- G9 K9 X% U
        {
, u2 R+ G+ K4 |# M5 _2 u                read_MSG_buffer(pshreRAM);
9 F' z1 z: l0 R; ~, G2 q+ O/ r; S% f        }               
! G; D- q  ~0 w# Y6 [}
9 F3 x" M6 O4 {7 P
* B2 x0 k  h  X1 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ I5 v4 P- {5 T: N. N
{
' s' Q1 Q) R( j. _3 S8 |        RX_MSG_PROTOCOL buf;2 X1 c- ^4 k9 @! K
        $ i# E2 {! I  h  M
        buf.a = pshreRAM->a;- X, d% Q  e; z! ~
        buf.b = pshreRAM->b;
0 I2 J$ T0 h& o1 y6 E  O* l6 [  j        buf.packet_cout = pshreRAM->packet_cout;; ^7 R. l6 A4 x
        / c: }0 q7 z3 a3 s' [
        if(buf.packet_cout != count_copy)( X# ?; W* D! [
        {. u4 m. J' z2 e7 u
                printf("a is %d\n", buf.a);
, `1 j& a0 q" [( Y4 }4 X/ W4 S4 Z                printf("b is %d\n", buf.b);) s. s4 B- i" }' l
                printf("count is %d\n", buf.packet_cout);
/ b; D3 B( m! \0 \$ S" c& c( ]                count_copy = buf.packet_cout;
0 v1 t3 O; \! t        }  O  d; {7 x: o& d7 p, j
        else
, a4 Z: O: t( x4 n" ?        {  ^: S/ W7 q8 O1 W/ i. ?
                printf("No effective message!");
# R6 d8 l/ v  E8 x; V        }
" A7 r! Q7 {6 f# T8 N0 J" f3 |7 Z}
7 Q% P; }; j4 X: c* \; P  N. R& {: B0 f9 ^* B  C  v
2 U& `1 p# D$ q' N( d7 u9 o# x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 W* Y" d9 _' N4 P9 H" S$ \使用下面代码,对内存使用了mmap函数后:) B1 \( C7 |$ {( a2 a$ @# i
#include <stdio.h>4 B$ ]8 }2 \( ?/ D
#include <unistd.h>$ F" ~6 U. r4 o( V
#include <sys/mman.h>
1 t3 Y6 k5 O) v/ G0 B% x. X#include <sys/types.h>; v" q; M+ z& s
#include <fcntl.h>
5 c4 }5 J* X. y( X2 M$ b+ M4 V! {1 g4 _
#define SHAER_RAM_BASE_ADDR    (0x80000000)) f  e# Y  H6 m- l8 ]
#define SHAER_RAM_SIZE         (0x20000)     u' }& V/ W1 B8 n* {

! j9 k! e; j' K' ?& i4 ttypedef struct
2 M. y! M- {8 _- O{" ?9 G; Q, y- U1 R3 s; X
        unsigned int a;) ?+ |. o3 c. z$ y$ R, e5 h8 ~0 a
        unsigned int b;, o! w4 Q0 H4 V8 X
        unsigned int packet_cout;& P" t" Y1 ?$ \( E$ k; c# t- n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 J/ A, x* o" b0 c4 D4 r, @4 p& v3 \3 E- N# M% x' E5 H# W
void read_MSG_buffer(int *baseaddr);
6 `: p, t7 _1 C) j" q7 g: F# dunsigned int count_copy = 0;& H' j' r* P1 W4 l: @3 q$ y5 A' n

- {0 E$ Q8 a2 g: z1 ~3 A: Hint main()
4 V6 N. ]/ a! w8 v{& U8 C4 u- w0 |5 @3 X( w
        int fd;, X7 X3 O- ~2 L0 r9 ?6 T
        int *mem = NULL;/ T8 G# ^5 T4 t
& j6 a4 |" @8 f- u4 v+ q+ z
        if((fd = open("/dev/mem", O_RDWR)) <0)
5 ?9 v1 d* M7 i& E        {6 ?2 L% _' p4 o& f9 U
                perror("open error");
( p  W; f& d4 W; Q. z+ Z& y; H                return -1;
" b9 E' K  t( [9 o3 h6 A! v        }
5 H" D# M' r6 E6 F8 `- A( H0 i# K        
! S' R% [% ~4 D7 `0 }        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  `4 `- R1 Z% K, }9 M
5 F: g; G3 Z3 @8 }) n% O1 ]
        while(1)
3 b5 W) n8 [3 e/ l% T% x        {
- X& u2 o/ o7 t2 j; C                read_MSG_buffer(mem);
2 o8 R) W' u4 B* W% N! P        }               
2 g- v- {9 n! |3 W; v6 O/ N0 i}
, ~( L$ A% R4 n2 g9 g3 g; x3 c: L' ~9 K  U$ w  }! K3 s# H
void read_MSG_buffer(int *baseaddr)
8 d  \; U- o( @. Y/ A1 w{
" E: ]5 K7 ]! ]! S, N& \        pRX_MSG_PROTOCOL pshreRAM = NULL;
" E6 l- @0 c8 j5 ?5 ~6 M5 D
. a: G; ]& O2 L        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" p1 x: h3 E( U) `' \6 O
3 b$ i6 o7 U! s3 x1 Z
        if(pshreRAM->packet_cout != count_copy)
" l& I: _7 w7 G$ k        {2 E" A2 r' R6 y" O# m# N
                printf("a is %d\n", pshreRAM->a);
, L. r! s2 H+ r8 @; {. K                printf("b is %d\n", pshreRAM->b);, s0 D6 ~4 [9 Y9 s1 W- @0 d; w
                printf("count is %d\n", pshreRAM->packet_cout);( u9 h9 i6 s, k% y/ s; r2 U
                count_copy = pshreRAM->packet_cout;; E1 t' w0 ?7 h  t. E* |* e
        }# h2 o5 K% z* U4 Q- U8 N( e4 V
        else
8 r2 y2 h7 r% A0 ]% Q1 U) U4 t/ e        {5 f8 H$ l- Y1 O/ p
                printf("No effective message!\n");8 I& _. v* P; R$ n/ j
        }& U: v6 d- v8 _$ U9 a
}7 E( N6 L" a' E! h2 [

1 Y/ _, J, p4 f; x! R没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& T# z4 v: s5 }% R
; ^+ r- c; \$ I
2 V9 O2 [" ]% f* b: ?0 m

" v. z) C# l! {( I: {0 q0 b1 k- G" E- i7 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-4 07:12 , Processed in 0.054955 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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