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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 k: O9 Q, M5 m$ W) y1 c: p# ^# o# p
" u% Q1 O3 D% x, X( A& }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 p% f' L' }* H) Y3 k#include <unistd.h>) y: {: a6 T" s
#include <sys/mman.h>
- r9 F+ E# v1 I% P! X" M. _0 @% H#include <sys/types.h>
( K+ G+ m. J" W! T#include <fcntl.h>
5 K0 @; o6 V4 A* n; E1 G& w
5 U" q, M9 D# Y' n' t, A! v* q#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' q7 P& r5 g* x- o' s: m3 h4 ~: s2 Y, S* j  Z
typedef struct
9 p& w$ m7 U  i2 Q{
, ~, c6 w- n4 p- O% p        unsigned int a;
( {9 J% X: t+ N/ G        unsigned int b;3 p5 |/ s5 X2 n8 M
        unsigned int packet_cout;- m( ?/ n/ L; p5 J4 m9 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  D+ Y, O) |, }' N

: _* C4 W" A' @4 e' p# E* v4 \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  r+ u6 _) ]3 B1 @8 qunsigned int count_copy = 0;# W5 w: [- T% ^) |

, C7 I5 g4 C2 ^: L5 S! z; ?5 ?& m. \/ E1 ]! E( p( v4 o
int main(). Z& P( d) F; c& ^
{
, J5 M# m* P# u$ l3 B9 R  ]9 \        pRX_MSG_PROTOCOL pshreRAM = NULL;
' V( q8 x4 _; d        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 u7 c; k$ y+ E9 I, W
7 u( a. o; i) {/ K7 U2 B0 q- i        while(1)
- J! _# X* X# @$ ^6 @) t$ u        {
' H! M' S6 n& E( ?& y# b: y; r                read_MSG_buffer(pshreRAM);# ^4 Z6 V/ j( b# x5 @
        }               
$ h% G' I1 j' L. k" J, w}+ n$ K. c7 I2 s) V$ X/ |

4 {7 ^2 J- [6 M; bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 E* f3 T# w1 ~' P
{
3 N# o. ^3 I% l3 O        RX_MSG_PROTOCOL buf;; M' o  k& `3 Z: R
        ! m( F- L9 R! v
        buf.a = pshreRAM->a;/ D- j: o( {$ r1 |- _, m! e3 @
        buf.b = pshreRAM->b;
' @1 O) k  s6 `9 `        buf.packet_cout = pshreRAM->packet_cout;- l- y0 L, [9 m/ S8 H! {
        : b+ q- x1 E. ]& z* \  B  x
        if(buf.packet_cout != count_copy)
7 J0 p) t4 `" d: \4 z3 \, x        {
+ e5 D0 m9 _9 ^' Z* f7 }                printf("a is %d\n", buf.a);! b. G* a% M  B* v
                printf("b is %d\n", buf.b);: i( h1 ?' s' M* ~' t. g+ k# T3 n# t" @
                printf("count is %d\n", buf.packet_cout);
/ a2 ?9 h1 `6 n; i! t                count_copy = buf.packet_cout;2 ?1 z# L9 I5 S0 C, ^
        }
) X* F8 L4 G0 _8 n1 E: ?        else
6 U1 E0 G4 Z, R! ^! v        {; E& F# U9 \6 [
                printf("No effective message!");
- \4 U& d6 F# L        }
$ A8 n9 O# G! o7 Z}
& a: N& w$ R( e' K& K: i- Q1 o4 `7 X6 v4 M
% w& R* k2 }4 J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# i* e) |0 `; y. q+ m4 I# s0 r: L
使用下面代码,对内存使用了mmap函数后:
1 l$ H5 l- y7 B$ q! l/ m#include <stdio.h>
0 d$ C& J$ L4 Z& L, t#include <unistd.h>
$ {3 g& p1 e/ B" j3 N$ `#include <sys/mman.h>% Y! U+ Y& c) u  _/ ~" U0 f2 e
#include <sys/types.h>
8 k8 F% t2 q5 n#include <fcntl.h>
# ^  ~# N* {/ O1 [
6 X" M1 B7 w  |. I#define SHAER_RAM_BASE_ADDR    (0x80000000)1 r6 s4 d; q4 i; V2 \$ ?8 i
#define SHAER_RAM_SIZE         (0x20000)   . {  M0 U9 k* N

* ~2 L7 _: l! G' a! n' Jtypedef struct
1 J9 m9 K+ U3 v; d% n$ a2 J2 j" \; O{3 b9 g' Z/ ^" W
        unsigned int a;
7 [- A; x3 ^& H; j% Y7 x" S" _        unsigned int b;
" K5 c8 B' @! h        unsigned int packet_cout;# U$ D- S2 y/ I: L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- ^2 g* a: _4 e$ o# y4 |9 C4 V; R! Y  o8 y9 M
void read_MSG_buffer(int *baseaddr);  i8 O/ J- |1 ?/ w
unsigned int count_copy = 0;
, q6 t5 ]2 `, g" Z/ x5 @# I: j: O: m. E4 l3 o$ M
int main()
! m9 k# X" H6 Y{
3 \+ ~4 `2 ~( W        int fd;3 E" H) ]$ V. q/ O
        int *mem = NULL;9 L) w/ F& r" Z0 k1 A/ l
- z2 g1 I! e! \! u
        if((fd = open("/dev/mem", O_RDWR)) <0)7 _2 ], g& R4 D" e
        {
8 P( `! M+ a! \1 E4 ^" W5 W; c                perror("open error");
( o6 ~+ f, @) m( ]5 Y4 m. L                return -1;- W; F  q( }( S/ w! |- O
        }
6 t% T( d% w9 q8 E. J        , ^5 W! c: z6 z  }! g: p# S
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" Z* M$ ?# |. O+ g
/ k' S2 a. R% S) _        while(1), z4 ?% @, W/ d* s: n8 u
        {
- C* i; f* B: P% d! N% G) h! c4 L                read_MSG_buffer(mem);
; p  g/ K  Y1 S6 Z, h        }                $ x' C7 A5 Q& w+ G0 ]7 Y
}" w8 @9 J8 x) C( W$ U

9 ~1 u9 K5 [  J- I, S1 avoid read_MSG_buffer(int *baseaddr)- L$ K( Q6 _6 g. I
{) t/ l$ p8 c- b# m& l9 `# b
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 ~6 Q6 L+ i' U- E' y
9 y5 J5 ~/ l0 \6 N% @8 P# Q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 d6 q: @% P6 n0 d
6 R% _& a% _8 A' I        if(pshreRAM->packet_cout != count_copy)* t1 x0 X% Y! U
        {* x6 ^3 U6 @- W' X5 t
                printf("a is %d\n", pshreRAM->a);& i0 E4 d) \4 T; M/ q, H! |" a  }
                printf("b is %d\n", pshreRAM->b);
, Q/ J3 G- F- u/ m                printf("count is %d\n", pshreRAM->packet_cout);
: z* p: A, {4 z0 c                count_copy = pshreRAM->packet_cout;
. u7 [! ^  G! {& H; o        }
8 `* ]- W/ _* N4 e, o" F# D        else
* a. o+ O" r7 \- b& @, x7 S        {5 Y; g* _8 C% x1 r' X
                printf("No effective message!\n");" z+ s9 a5 N# T4 R1 P; K' P; V
        }! ^0 q* i( A0 o& e& r* I
}  `/ |: i& B( o+ Y+ `: Q$ M. ^
; Y; l/ x8 O- Z( O) W8 a: I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 h# l9 \7 \) n! Z! j# C7 r0 b
% |# B! M% F, n* t
) h+ k6 U. }$ M1 ?1 v& G

2 f5 \0 _6 A, [/ x
, q/ `4 K  i' [/ S  {9 c, w% U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 12:56 , Processed in 0.038229 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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