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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! g' u, {5 L% T! @5 q0 ]
7 U2 e" u) U  B4 i: }5 D1 L0 A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  |) `8 x+ w. W* ^
#include <unistd.h>* @& F9 V' y/ M7 P6 x& [, i: |
#include <sys/mman.h>! Q: `0 G! M1 P/ f
#include <sys/types.h>
0 X) y+ ?) e) Z2 [. _#include <fcntl.h>
, w7 G: W2 l1 }$ T
: D# O( n& d) ~& c- a6 i. C#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  q: h- S! M% u; P! k. {$ J
  {  n+ \9 J( |% S2 Q5 d9 d, K- qtypedef struct
$ ?9 ~7 S- [! H2 I. Z0 x3 [{' I! k9 M( u* i4 a# w" m& w
        unsigned int a;
+ G  ]8 D% e# t  z, ?        unsigned int b;, {4 S) U8 N: l
        unsigned int packet_cout;0 |" y2 O# h3 Q+ K3 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% _1 n2 d4 i; i! o
" q( u; H  Z- b- U0 o4 s. I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" u; b" [3 R. j9 E2 E7 h/ munsigned int count_copy = 0;6 v" K9 f5 p  y* p/ Z) q
0 ~3 \" P1 v. S
8 ]9 f' R# A) e+ ^' H
int main(), t8 f3 z5 V+ T
{
& R, _8 }6 ~. _- ~" |* B  N; c% x        pRX_MSG_PROTOCOL pshreRAM = NULL;. c  s7 N$ N0 D/ x8 O) S
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% d, y% e  L. [4 ~* P+ `  F

5 ~3 A  F9 e) O        while(1)/ ~+ `/ j/ L& c$ r
        {! l# }# w6 Y! C0 j# m8 ?0 F
                read_MSG_buffer(pshreRAM);
6 I8 o2 C# D% O        }               
  A- f  g4 w+ n2 m/ l" P* y}
. w0 ^3 Y1 Z' }3 g
/ w- K$ F, A' B' p' S) ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 [9 X$ r' K# y" A, Q$ P{4 l' g6 p+ e; u9 d* H& }8 ~
        RX_MSG_PROTOCOL buf;
3 t3 Y3 N1 k4 x' J. T' r! L) N5 Y# E        9 F" o3 F. w) u+ M: G  M& H. @  [+ [
        buf.a = pshreRAM->a;
1 c# T, Y& c) \3 c! F8 l  ]        buf.b = pshreRAM->b;
. C- K# I  d/ J* ^7 e+ K0 c        buf.packet_cout = pshreRAM->packet_cout;# r6 v2 i: O" v1 I7 E5 p& l
        9 X( y8 m0 U& p* I( D) _' T
        if(buf.packet_cout != count_copy)
. N7 c" R3 R& K( e3 _        {
4 m4 r$ t7 v- H                printf("a is %d\n", buf.a);3 z, X' k$ _4 x0 ~- c
                printf("b is %d\n", buf.b);* F) z0 A; P, O1 \3 f; R# p/ n
                printf("count is %d\n", buf.packet_cout);' t5 }% ]1 h9 X, i8 M, z: a
                count_copy = buf.packet_cout;: U* w5 c8 r6 ~; X- B+ a" i
        }
/ R8 ]9 F1 K1 P: g5 ~        else; q/ \7 i4 e4 v3 v  e7 `$ u
        {
7 w: M% ?2 Z/ P$ Y0 a+ V                printf("No effective message!");
0 N7 ~( t8 |4 {1 a) _        }) V1 {- H" a1 h
}
2 {/ J- [+ T: G8 a) |' L$ x
) ]- ~& q1 z; x7 a. e1 O/ W2 n9 m0 M3 L# Y* E' k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" C- A* ~! m" K% p使用下面代码,对内存使用了mmap函数后:
) [+ q' {2 \" I7 b! J#include <stdio.h>
; {3 m1 A0 i: {3 `& \4 i0 h) |! `5 f#include <unistd.h>- Z+ n  Y  N" J+ u, {1 Y
#include <sys/mman.h>$ p2 ^; O% o  o' k3 E9 T5 p! O
#include <sys/types.h>+ [7 n/ R9 F1 ]; u) T! `6 f
#include <fcntl.h>
. ?; v3 ]- x, T+ e, e1 k5 B
0 Q! u& Q, o( H6 e#define SHAER_RAM_BASE_ADDR    (0x80000000)3 V# Y* s$ \( g6 s( i) U8 `( g, Y
#define SHAER_RAM_SIZE         (0x20000)   
; |. W' Z1 H4 p' r' T% F6 ?
/ L8 ^9 l8 x. b. M4 M( R4 o" W2 _8 ptypedef struct
( L2 g( v# X+ g  L" {{
' i. D$ t4 a- W0 e# r! l        unsigned int a;& O+ c3 `+ c  r5 E& y9 |0 ]
        unsigned int b;2 Z+ \' R8 x- W+ N' [& @3 L& L
        unsigned int packet_cout;
9 x$ M$ D9 p" Q; z9 }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 Q7 S( E! t6 u, p
- n9 G/ t$ @7 [9 u# X2 p1 Fvoid read_MSG_buffer(int *baseaddr);
; D& v1 v, j9 y7 i) z3 {# Tunsigned int count_copy = 0;% O5 |2 X- V" k  U  y, u

# w) ^- o: I# l( b: Bint main()
2 h! b; c# G& f. j1 J{  f/ p' ]8 L4 s7 x( e  u0 f& N
        int fd;
) [6 d! i3 B6 {        int *mem = NULL;
  v5 W' m  a6 j* z" N  I( U, s
. {, Y. |- t% c+ {        if((fd = open("/dev/mem", O_RDWR)) <0)1 o8 U# u/ b) C, M8 u, l6 d$ `8 o
        {
1 H* O0 Y$ x: A/ W* d                perror("open error");+ g* d& ?, d% I9 K% A2 u( t& |
                return -1;
  b9 y! a, E0 P! Q3 i$ c$ i        }) p- b$ ?* ~4 u# R" ?
        
3 ]& w, F* Q5 r" M* t7 q        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- i# S  ^- V+ k2 g& q

) r1 F$ h+ I  _. p5 i1 [" P" a- V9 U        while(1); t! [& p; P: Q. X- R0 |4 ]- `6 i
        {
& Q& O! t3 J5 I! e7 W" `                read_MSG_buffer(mem);
" y0 o4 |# W) G  Y8 D' g1 K6 z        }                5 v; D5 d3 @5 A- Q% @
}
+ t3 E2 E" D! ~
. @$ j" w2 v- ?5 u' D& ?& T4 K$ Gvoid read_MSG_buffer(int *baseaddr)
2 Y0 i3 F7 g/ \- Z6 b( u( L6 @{
3 C& g0 s3 d7 S$ M6 J        pRX_MSG_PROTOCOL pshreRAM = NULL;
; R& ]+ C3 I" ?/ ^+ T) T  c! i7 L* H' T8 }% N
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 X+ K$ l3 P3 c) G8 C! R" q+ D* y) u

( ?% \7 W6 ~/ z& z% \5 L        if(pshreRAM->packet_cout != count_copy)% m# E+ W9 I: j/ q8 a( H' O
        {
- u4 g4 |0 a$ q! i2 @6 j* I, b9 p                printf("a is %d\n", pshreRAM->a);
9 c6 |2 [0 s0 ~0 H( n                printf("b is %d\n", pshreRAM->b);
6 l; Q6 @, M' _# g0 H                printf("count is %d\n", pshreRAM->packet_cout);! |6 Z  l3 g" W# l; @6 w: c, x
                count_copy = pshreRAM->packet_cout;1 `# i: X1 |9 h5 W; i: N. |7 E
        }* F$ m: ^! _- y
        else
/ _/ K2 n4 E7 x; i, D  R        {, E, I! R! W0 S; _  I5 o
                printf("No effective message!\n");  s0 ~6 O* I, M/ V' f6 H. }
        }1 C  o" A# O/ G: K$ {
}
4 v! U0 v0 g4 P9 D5 w: G# ~+ D+ {5 W4 K) D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; A5 i( n' F  Q# |9 A5 w

- L3 C- s" y- ]- y" I6 j0 Y6 M6 D/ C! S) f8 f* e
) {) e  L4 j% _& x4 j

& T8 n6 P+ q7 g% [' T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-31 10:34 , Processed in 0.050757 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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