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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . F2 g: J5 z3 F' b: p  j
% K- i, d- c& t# p/ q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* d+ t0 P; |# m/ B& m
#include <unistd.h>
4 r0 p; p7 _) `% B6 n2 O) Q#include <sys/mman.h>0 U/ Q8 }+ n9 G- A1 c  _
#include <sys/types.h>4 p+ T' j0 `, ^6 f. Z7 m9 s
#include <fcntl.h>
6 O" J5 l1 r3 j- O( w! [
" H& j/ H9 g# Q4 m6 M7 Q8 l#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; C3 s) }, r3 f9 r  y0 n0 r8 [+ e9 J" f) G7 [0 C. E
typedef struct5 ~, g9 B+ ~" b7 c& g
{
, M( K$ h& C% w$ W" d# \- K1 o0 n        unsigned int a;
! |+ k  y# \0 Q        unsigned int b;" z( |, T* u$ f: L" x- {
        unsigned int packet_cout;# ?& N+ V7 X2 \1 }  J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 `; H0 g6 R1 v+ U2 s) d% \* L  ?( o
" s& ]- p6 U4 F! W& E  d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 F* ]; m# e/ w4 n7 v( |0 I0 D
unsigned int count_copy = 0;
. B4 e" h: c6 h1 j. X3 K
0 }# I% H- v( d& Z2 N$ A
2 G8 n# B/ ~, ]int main()" K7 _1 o# b! s
{4 l6 {  X2 o+ |$ [- M
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 a1 z& D4 u9 H, G$ B& a# Y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# l' x0 ^1 s" Y6 O' ?  [
7 s1 M+ v& E! p1 l" c
        while(1); D$ T8 V# g% F" Q) S5 o7 C
        {8 V' A; G8 `0 _1 I) E5 s/ T5 o
                read_MSG_buffer(pshreRAM);
7 h* B7 m6 Y( i3 n* V7 e+ i9 M7 W        }                + g2 v$ h2 B2 N
}+ O7 `; g/ }- l, D. U; m) \
& R9 R* A4 u7 L- M" l; Y" G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 o- I5 H9 D4 U
{
% K9 W/ y+ T, J: s- `# g+ n. S        RX_MSG_PROTOCOL buf;* w2 B- d% B1 u, N
        
. a2 y! O: Z8 X! ?& Q! _9 a        buf.a = pshreRAM->a;
5 M9 h2 H1 P' E4 o* x        buf.b = pshreRAM->b;
6 }9 u7 N! r- g- a' R        buf.packet_cout = pshreRAM->packet_cout;
) G: k; n3 C: h        . r7 H! ?9 b8 h5 o3 _
        if(buf.packet_cout != count_copy)" h6 Q* \! D8 h% c  P* r( T: ^
        {. z! b1 K+ }6 D
                printf("a is %d\n", buf.a);2 `( l  ?9 t, ?0 Z  V$ B4 n
                printf("b is %d\n", buf.b);# C) a% g" B+ g! e
                printf("count is %d\n", buf.packet_cout);
. M( Q1 a% n" o0 R; u0 E                count_copy = buf.packet_cout;
. F9 T/ M5 `, }# l* u        }8 c, g$ }6 Z+ j6 H$ a- z( f: I
        else
9 h) l, ]# P2 n8 o- ~        {0 c" }+ ~# f- [: O9 s
                printf("No effective message!");
1 j; h: Q; }/ b4 ]        }
0 D* g6 R/ I" \& F+ `: Y6 g  ]}  O, x# |, y# O3 @0 A& {' M

1 v8 D, U% E% b5 \; ?/ u. g  a( H" `2 o) y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ i( l( L& q* ?3 Z8 l; p( o
使用下面代码,对内存使用了mmap函数后:
/ v- w; l9 e: L- T#include <stdio.h>
! i( L/ O: p+ ]+ e* I#include <unistd.h>
) p  h* X/ g/ E% s6 ]8 p. s#include <sys/mman.h>" B6 v1 Z$ ^, j
#include <sys/types.h>
: Z+ K+ s1 r3 j" m4 Y#include <fcntl.h>
0 e9 X, z; F2 v
  X  ?- y2 ]! h' Q, U! m/ v* L6 V#define SHAER_RAM_BASE_ADDR    (0x80000000)* a" J5 ^7 d! e
#define SHAER_RAM_SIZE         (0x20000)   ) [/ ]* r8 Q$ t0 R* p; u# J6 Y# K
; \4 |! i2 M3 j7 i9 P& q& c
typedef struct! _' |6 B7 B4 z
{$ s0 j; E5 u$ ~. x9 H# \, [0 H
        unsigned int a;
& W, \3 B2 b% l) _/ _2 U        unsigned int b;
4 M: s# g' y7 \6 q        unsigned int packet_cout;
$ k9 t+ g1 g1 r" T& R; e' Z# _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 |/ T, g" b8 |0 f" t9 \4 ?, A& ^& T9 K' o: b; X) F$ B
void read_MSG_buffer(int *baseaddr);
! x7 S# l! `3 _0 S9 R% Q! `unsigned int count_copy = 0;9 k; ^1 [6 a) ]. T, o
. q+ Y4 R1 X% D5 b, q, X& W' w
int main()
, x2 F7 b- _# N& \{
0 K- @- S6 X, s1 j- l5 E        int fd;
: j  _6 Y. I& [        int *mem = NULL;
; }0 H* m+ f! q  u" l2 B
- g( k/ u0 D4 A        if((fd = open("/dev/mem", O_RDWR)) <0)
  e  R1 i/ b  z: |& b        {: J- K7 M. U; m
                perror("open error");
; ]( H) D- {: R! ]$ N3 u# [1 {                return -1;7 S  e' Z/ o7 A
        }( T3 X& {; `( {; v6 V$ i! F- n
        
) L! h; u+ P: g8 R, Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* L) Z; N+ g+ @
9 f: v* r6 R; h) W, f+ Z1 Y        while(1)
$ D/ }+ S9 ]4 {) e        {, W  I" M( d, Z' Q% f" W
                read_MSG_buffer(mem);
! @7 ^2 b6 N4 w        }               
  l( i% L/ C9 j% C/ ?6 A}; A' m6 a( o  J( f

% Z# |6 l1 V% N9 z! F, }void read_MSG_buffer(int *baseaddr)
7 H: H$ x; \& k* J/ m: n{
$ ^6 V3 g* U; S/ E        pRX_MSG_PROTOCOL pshreRAM = NULL;& V* `+ Q8 R, X, ?

- M3 `/ G; N6 G" _' G! D        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ y0 [9 l+ b' a$ N/ c" T3 ~
( o% f: Y/ r8 c- {" _! }* g
        if(pshreRAM->packet_cout != count_copy)
9 z+ t% s; [1 e  \0 m% N$ Y        {* R: X) R6 I( \3 ?! l) ?
                printf("a is %d\n", pshreRAM->a);  l$ M! }! h% W0 d& l# V; r
                printf("b is %d\n", pshreRAM->b);) |  l% Z7 y, Z( P- g
                printf("count is %d\n", pshreRAM->packet_cout);1 c* y# q$ o, |+ y
                count_copy = pshreRAM->packet_cout;
" \" a" e) e, }        }
# b& d' P# o/ `% ^1 u        else
1 g1 w7 Z/ d/ D/ d$ m" ?        {
8 ~% C7 a5 C( m9 r1 G                printf("No effective message!\n");. o: l3 W7 w7 X% k- u) n/ F2 k0 Q
        }6 @, p4 s( X( }7 Y
}
% f: Q) A" D0 j2 u% [" n
8 F, H% s+ K2 k% [$ [+ B没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: Q+ O7 P) z0 c2 U1 `5 ]
5 D3 A) c  m9 \7 V- e7 `- l% z2 i1 G4 y
" U+ M/ w1 `5 K  M7 C. ?

1 M! h5 d9 u; u. b, ~3 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-25 21:24 , Processed in 0.039626 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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