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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 B8 k" l4 L/ L/ y0 J6 }4 B
6 T9 W# S8 |$ POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ B7 T2 o6 `* _' c, T8 P$ F#include <unistd.h>
4 D" q' N9 Z/ V) Z#include <sys/mman.h>. r0 B6 T( [) q9 x- ^- A
#include <sys/types.h>( [9 \0 Z6 I  L& `
#include <fcntl.h>0 Z7 \# m$ e2 o+ H4 B# s

* z7 g9 J) w" o6 x#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- A# K7 i: b4 y3 S5 L" P
# g! s- C) M8 j% v4 v' y7 Ntypedef struct) T2 o( z3 G' }7 K* Q
{
% ~/ N* U& W8 g! r        unsigned int a;
& F( B+ z! n/ Z        unsigned int b;
, |$ d) g3 e( M8 F) I* I        unsigned int packet_cout;
7 c( ~% ?. u$ E& Q/ K% I* O) H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) e6 u7 N( w* y1 J3 \7 Q) a3 I. y  W# Z& v4 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& R7 N7 h% {9 N! `% s% Y% [
unsigned int count_copy = 0;
2 a# K7 [  N) M  x4 Z( Z
" N& T! g: H) k' ~. g0 N+ m- w" V% Q1 ?! j9 u
int main()
4 S0 P  Q0 ^& J* e. e{
* M9 f, A4 [  B        pRX_MSG_PROTOCOL pshreRAM = NULL;6 s! H5 _8 ~2 o  c' y$ [/ R
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% \) U* o0 d- ^

0 X  X. R5 }! Z        while(1)
# D% M4 @1 b% M' X7 b; n4 Z+ E        {
. y! j* |9 z4 o& ]! l                read_MSG_buffer(pshreRAM);
: I5 F# i, Z. O" d1 `, u* R        }                5 s! r- E8 g- T
}% F: D) i4 T3 R- \4 a# t2 f) G

! y1 C9 w9 E* V# s- pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 H2 S' ~$ W3 l# z; M7 c{
6 g" ?' h! s4 [* Y9 i2 P        RX_MSG_PROTOCOL buf;
$ I( S( |/ C! e8 h1 C" w# l1 P        
8 y1 V4 t& r1 Q5 K6 s/ v: y7 i0 S        buf.a = pshreRAM->a;
* D$ y1 R" N- y2 S( d        buf.b = pshreRAM->b;
0 Z2 d# R4 j! S2 j$ q$ b& |" ~        buf.packet_cout = pshreRAM->packet_cout;
1 E0 h7 b" i  l9 f; G' b# C        . J" ]! R5 E6 Y  c: m6 D
        if(buf.packet_cout != count_copy)
6 ?) C! I0 X6 f3 O8 ~: X8 _/ D/ [        {: N- M1 M8 ]+ |  |
                printf("a is %d\n", buf.a);8 c6 w+ I% h* _! P4 X& Y
                printf("b is %d\n", buf.b);6 p  W& U* q$ e5 i" Q& `
                printf("count is %d\n", buf.packet_cout);! y# y9 S6 M! d9 {3 f0 E
                count_copy = buf.packet_cout;7 c+ b; `3 k. f/ O  L& c
        }
" V7 d, \, {/ J8 E; _2 W        else
9 m+ j0 o, I2 l7 F! i$ G0 d% e        {
! Q5 T1 R3 k- |3 t                printf("No effective message!");
. y8 [. [! X/ W+ l- c        }+ i) i5 C# K% \" s5 M& N
}6 a( M- Z1 A- o: O0 r8 k
1 Q2 _7 C3 I6 q- `* M1 J2 _

% ~2 b' J; W2 h8 `- G. C9 U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# y- F( B0 P1 y% a2 U+ ~
使用下面代码,对内存使用了mmap函数后:
% y6 V* L; s+ I' Y4 w2 E#include <stdio.h>% f$ n. z* f/ O$ I
#include <unistd.h>
* I& \* c$ L, H5 P$ R#include <sys/mman.h>6 K- a0 ?& b" Q: p. M4 V
#include <sys/types.h>; X# I8 D  @4 I. e! Z4 \- e5 r
#include <fcntl.h>8 v4 E: D. ^5 S5 y% u

% i5 O+ O2 x. L' U5 U#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 S- d/ `0 I0 D+ `# u, u/ k5 q#define SHAER_RAM_SIZE         (0x20000)   
) S" V7 g$ k/ }7 I, H
+ S( O& X# Z6 @0 W9 j4 k) Q2 {typedef struct  l6 O% D. h+ V. @
{+ M5 \* c$ o5 t1 j3 ?, d0 U* C; o' n
        unsigned int a;6 n" w5 X6 h2 Q2 i9 F$ o
        unsigned int b;
! L1 e" X6 y6 E- F% y/ s" q        unsigned int packet_cout;8 s5 g& z" a* p8 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ ]2 @  m& W) ]2 ?5 j
( F/ b6 _2 ~0 f1 Mvoid read_MSG_buffer(int *baseaddr);
  l+ W. S4 X: m5 h& `unsigned int count_copy = 0;3 A3 C- g: ^- \& w
5 y5 u1 l* G5 W
int main()
  ]8 V& p" M2 }# j{2 @3 R9 G7 b# f8 k4 Z0 M
        int fd;
9 V( Y" \& p  @5 i$ G" i: L, n        int *mem = NULL;$ h: ~! y6 |# f( F4 x* ]- p

4 J' F% U  @! w) c        if((fd = open("/dev/mem", O_RDWR)) <0)
$ B" L( G' A& ?: _" z& p, {  n        {+ B1 Z2 ?* W/ W2 B) S$ C9 d
                perror("open error");. e; E+ L  Q/ b* t, H# B+ A0 L& h
                return -1;, X3 N5 q. O1 C2 S+ k6 L
        }
- M5 ]8 H* x+ H+ x8 ], @        $ V' D8 h7 M* e
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ g, ]! Y3 s/ T, h2 ?/ N$ n) ~/ o. G0 P$ m. @! ]2 |4 Z
        while(1)
: b; V  Q$ y! n3 R3 Z        {; J) {: q- Q' E+ f9 Z/ e
                read_MSG_buffer(mem);
9 p! u& S: C- k$ w- V/ T8 _        }               
+ J! O% Y; X* r! N" P}, ^6 o! i7 q; O0 v7 Q- B6 ^$ s

& C- a! A/ c* J5 Fvoid read_MSG_buffer(int *baseaddr): Y8 w2 ~5 g/ h% P7 k
{- m. Y0 z8 t$ P7 f
        pRX_MSG_PROTOCOL pshreRAM = NULL;; T( [0 r/ |  r

7 _1 {+ @" }" L. d        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ Y, d6 M6 y, U, Z
. C2 b1 e& D) y  ]9 H$ a        if(pshreRAM->packet_cout != count_copy)
0 \4 C+ K2 C) e/ l4 q' ^( _        {8 L# [$ X" n" A! M
                printf("a is %d\n", pshreRAM->a);
3 L% {0 J) p% q$ k5 c7 i7 t  y                printf("b is %d\n", pshreRAM->b);
8 X$ c  q) H3 ^8 d$ C/ g/ m( J) {( w                printf("count is %d\n", pshreRAM->packet_cout);
( n  ^5 w+ a3 ]# x; ~                count_copy = pshreRAM->packet_cout;
( L) ]6 x: Z6 U$ f  x7 B        }
1 S& X- V, s+ W7 [+ l" d0 z4 K        else) Y, c, A. `2 H4 o6 R, r0 q
        {4 x3 A0 E& e( H$ N
                printf("No effective message!\n");1 g! w# ~  e1 N: Z
        }
( Z! |5 W7 {; ?8 v  y2 e5 _}
4 c$ o7 X+ s" G* o
" c4 k' a, U4 K0 k9 A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- R& R$ @$ J. N. N( w% i0 C4 b  C, @+ t

4 z. g0 {& |; x) @  u' T! t2 y+ Y$ n

! k) L# d6 K+ J2 P4 T4 @) ^0 L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-24 12:23 , Processed in 0.043396 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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