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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 u2 H& E9 m7 A* c4 j" g" T8 o0 \& P7 G/ R; z( f: P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* B8 x7 G! ?4 L
#include <unistd.h>. Z* j* V- a4 Z& s8 ]% |
#include <sys/mman.h>+ X3 \! C0 ~4 \4 `5 |2 I
#include <sys/types.h>
6 U6 v; p5 \# ~#include <fcntl.h>0 S" ^- Z" b$ L" d0 o- h$ z& N5 S

! I8 \5 s, p% X5 P9 ]/ n) z! M#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 U; e: ?) Y' X7 {4 L: g5 j3 h# V' @
typedef struct; B; P) w# Q7 m
{( z% X( k9 h, e. N1 y7 m
        unsigned int a;' C6 R2 k* l9 S. w1 `6 d+ i4 I+ ~, L
        unsigned int b;
1 Y* w6 |' U* t$ r. ]' u% w/ E. d        unsigned int packet_cout;( V; m2 O" \& w" a! {* J  W1 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 A- V$ C. f2 ^3 }% G- j( @9 g; B
" b3 E6 I$ _, R# K* B! fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' \5 T( v' S6 @( G
unsigned int count_copy = 0;' q% Q) m: w- Q) {5 m
0 k8 V  H  |! c8 g

* E' [  g/ ]1 \% a5 K  ]int main()
/ q5 `2 U" K" Q: J; B# Y, q5 I2 B{: w( A; A1 ]# D5 |
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 i) v1 V; n* M        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 t5 e* C5 u/ q( F% I/ c

4 n+ y. g% O' h9 J1 B8 x. ~        while(1), S# G& P6 y6 m
        {% G) ?* D$ T6 `4 y
                read_MSG_buffer(pshreRAM);
4 r8 y' d- i. @' K' }9 w. j. U        }               
* Z6 \, j( Y* Z* [. V8 C/ s3 i}
) w+ J2 ~# H; s# c' u; A9 e6 X* D, \# e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# [# A4 }0 \, ]{
' E$ M% G* V' v) O. r        RX_MSG_PROTOCOL buf;6 {/ t# j! j, E5 g7 @0 e
        
# h* h4 Z* o& c* Q" h% k        buf.a = pshreRAM->a;4 S  ~7 }- ]0 H) L1 K, I% E- m5 h
        buf.b = pshreRAM->b;
1 R1 p: L4 x- C+ o7 {        buf.packet_cout = pshreRAM->packet_cout;
: b/ Q2 V7 F7 Y. L6 ]+ L- h8 H        
5 l9 u: b$ N6 K1 r        if(buf.packet_cout != count_copy)- @6 v6 Y& K0 F3 W
        {; u5 e  t- c. ^& Z( ?4 b5 F
                printf("a is %d\n", buf.a);- m+ E, H% `' m1 j$ g% f1 b
                printf("b is %d\n", buf.b);
4 D3 k/ I3 M. u                printf("count is %d\n", buf.packet_cout);
8 k( U/ t) t, A0 K                count_copy = buf.packet_cout;
* }' ~1 A9 ?4 u4 @  L) ~( T        }
- d" X$ K. r3 b0 Q: h0 x. R        else" U, K1 U7 V9 t
        {
% k& \9 n/ I  ?; I3 O                printf("No effective message!");
! ?1 T2 }+ R6 D9 b. [        }
  A1 o: Q1 U  p. F% y, J2 F; u# X}
) g6 E7 `! R, L$ l/ |! j2 h& K+ z1 |# e. V) v
+ A: ]7 _( f% @2 t
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) j3 x8 q5 b. o' R9 S
使用下面代码,对内存使用了mmap函数后:3 Q( v! M7 B4 `* F$ n1 E! f
#include <stdio.h>
1 b# }5 f+ s) z: S# D; c5 S! _#include <unistd.h>3 ^6 p% x( }7 `3 i
#include <sys/mman.h>
( @. J5 s/ m, R#include <sys/types.h>
# _! x( \( z' }" d#include <fcntl.h>! f$ [# s+ |: ?  L0 V
* o/ b( I4 z+ Y1 b
#define SHAER_RAM_BASE_ADDR    (0x80000000)9 V: Z! C8 X& q1 F
#define SHAER_RAM_SIZE         (0x20000)   6 k/ G1 U4 B6 F  T8 ~$ }
* |, o1 U: \+ |1 @2 n" W( b
typedef struct; w7 Y0 P' n1 t/ s# q
{
8 L: d5 {7 h& a: @/ t        unsigned int a;
6 ?) K. J6 M# s  O        unsigned int b;
" N6 O( x. Y% L7 e9 k        unsigned int packet_cout;
* \3 \! T4 R+ U2 Y' r, q. n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 X+ j+ G' j# o0 Z0 z1 A1 W! V

. R$ v; |; ]$ B3 B% Gvoid read_MSG_buffer(int *baseaddr);
; n6 C) x# w9 y6 ounsigned int count_copy = 0;
0 N0 |! w% `3 H* o' }: h5 }: A( D; ~% A8 _1 J' }
int main()( `' U7 r3 V; i+ l+ I! ^9 g
{& h+ J; v5 c; m
        int fd;7 ]6 b4 J/ d% A, ~
        int *mem = NULL;
2 I$ D- S; E! Z. o" ?$ [) V. v8 V4 f1 e, @7 c3 c7 t. W
        if((fd = open("/dev/mem", O_RDWR)) <0)+ n: w# Q0 e5 n: s# U
        {
  f( e2 |5 d2 Z% {                perror("open error");4 [) n4 r# ^6 p0 r8 r! V; n
                return -1;
" A5 E, z0 G; n) {4 l7 K8 ~        }* B2 D+ w& g" T8 J! ]7 }+ Q
        8 m; A0 m6 p$ a- E8 h1 O! J
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' J- i  q% U6 h! g) _
& A' g2 O9 b- `" m
        while(1)+ @' p9 B% `. a& \7 B
        {- V* _6 C6 c: k$ e/ X' W8 r
                read_MSG_buffer(mem);
" L+ P5 c' O( ~' U5 \$ U' l' l; n        }                * [' N, o$ {) D# L# G6 O
}/ T' c( X/ D6 f" s7 ^
. V9 B1 I: {& t- d1 M
void read_MSG_buffer(int *baseaddr)
3 W4 T/ B* ]. [7 }{- Y& d$ I9 z* A' M: r; h. I  \
        pRX_MSG_PROTOCOL pshreRAM = NULL;" S/ Y6 g1 s3 D' |8 ]8 p0 f
$ @  U4 e2 {: q) N* G# o
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 E6 }7 d  \0 J% e; ~" p  I. L! K7 u/ Y% W+ A3 \9 D) r8 x6 J
        if(pshreRAM->packet_cout != count_copy)
1 N, h% G- H, o5 m$ W$ M% n3 ~$ y6 n        {
: L6 n9 Z) k. c( C3 M  q3 l, {                printf("a is %d\n", pshreRAM->a);: t. d7 Y; M0 l; u5 S
                printf("b is %d\n", pshreRAM->b);
0 a. W0 T5 ~; J/ E                printf("count is %d\n", pshreRAM->packet_cout);
0 h  a$ P  t! @3 ^0 h4 |( a                count_copy = pshreRAM->packet_cout;- L6 w. y/ G/ Q
        }
. g3 a0 u3 c4 M        else" _( G  w" o7 o
        {
  G3 g0 i3 p8 K, D9 f7 i( U                printf("No effective message!\n");8 m! c; V% t; n3 I& _+ W3 a
        }
8 P: ?" i: v) `8 D}1 m. ?, u) a3 x
- S, [' H& I( i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 b5 U- G" K+ @5 U2 P0 x( Q, p6 Y" V3 f# F6 K

, s2 u* w6 J- ]
+ q: w& A6 N% s9 X, u- m
0 S5 |6 T- J* B7 Z8 U) _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-29 06:42 , Processed in 0.040082 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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