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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 N/ ]. W! v" m7 M2 H( O' R
6 ]# }( ], e. |! C: G3 ROMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ _+ H& h3 c6 [  z6 A. _# u5 O, ^#include <unistd.h>1 r$ R; ~4 K6 f( R' T8 r1 _
#include <sys/mman.h>: Q5 g+ j/ _! ?
#include <sys/types.h>$ ^  z$ j8 R3 C/ j) U1 W7 k* z
#include <fcntl.h>2 v9 N+ u. T1 P. ~) Z& C- L
+ z4 _$ B. Q; z, |% t( `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" X, W8 D( [5 A& h  E
% s% }6 @& @0 ]3 J! wtypedef struct
6 z6 Z" g) p% t* }& G8 X4 [9 A& v5 |{
' l2 p2 @7 O! s; K        unsigned int a;
; }& |; x4 u- K! v8 @        unsigned int b;
# a: o4 j; D6 H" F        unsigned int packet_cout;
3 }* y1 |0 T* q! b$ Z- Q2 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A( h. y) X( b; l2 U! T3 t' Q) E! g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 P/ U3 m% v$ N; N8 v( H" Yunsigned int count_copy = 0;0 h, H8 V% D) A% n( ~: O7 ]
# R) |9 |- N' j' |) W  X

' n* J9 k0 p( Q7 ^5 Z! K0 Q% n$ N2 Kint main()
9 H0 z! }) O# H{
0 a) g' K6 q4 w1 U        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 Z9 A$ f6 C3 y2 r1 e# i        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 A" ], |6 r; b/ [$ G
6 X4 i. |# g7 X, o+ h# q, z; L        while(1)
* S' _  W8 r; Z        {8 l5 t8 L5 F8 o8 L; e/ P
                read_MSG_buffer(pshreRAM);
: e! V+ C7 M: C4 X- q, y        }                ) _  C$ \/ L/ b4 A- v. v9 F
}
1 g. h& o/ o4 E
2 p5 G  D# M3 U! svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 m" z% Q$ L4 J{5 d7 f! V/ c9 E& M5 J- ?$ f/ H
        RX_MSG_PROTOCOL buf;
# N. V8 h; }! w9 q$ W6 s        
, \+ \. m+ K: G7 z        buf.a = pshreRAM->a;
8 y' W5 b6 I5 ]5 o( f/ O! G# ^2 ]        buf.b = pshreRAM->b;# R8 \. I6 L: {
        buf.packet_cout = pshreRAM->packet_cout;* N% g  v" r: R9 c8 w
        " A3 {+ b* Y# X* D" ]6 v
        if(buf.packet_cout != count_copy)
& r/ ?2 Y  y  Z' ?$ y% F        {' ^8 J4 @3 ~* E. o: `) u
                printf("a is %d\n", buf.a);! H5 {" a9 N  ~$ `& h
                printf("b is %d\n", buf.b);% N1 e$ `& B- O% b$ w
                printf("count is %d\n", buf.packet_cout);; q! b' R  P  \$ Z1 l' ~/ e, n
                count_copy = buf.packet_cout;& ]. }( I- }0 n5 _, {
        }
9 n9 ^4 a" u  Z7 Q; M7 n% O        else
3 B, u- V/ j# H: [5 a7 O        {/ }4 p8 l( q1 b
                printf("No effective message!");7 t+ v& H- d7 X3 N
        }- O' ^) F3 W7 b7 r$ R% C* K
}9 \8 a  Z. d/ K9 j% v
" {  n& |  P" n. Z" Q: o' u1 ~
7 \. x, e: s4 y' G: w6 b+ D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 E5 |" Z$ }% f' w- A
使用下面代码,对内存使用了mmap函数后:
4 ^$ `. t& E& r" z1 I+ P6 k#include <stdio.h>" {' j* v, `9 e! ]" ^  x4 Y. I
#include <unistd.h>7 T8 c# N- Q9 O4 Z9 A; n: k  `  q
#include <sys/mman.h>( U% Q& M. Y9 M3 q
#include <sys/types.h>
, E9 X* Q: Z" z' Z7 ]#include <fcntl.h>
% i7 q! ^% X6 G
+ j$ B: q; z0 F) R5 ^" H' [0 E#define SHAER_RAM_BASE_ADDR    (0x80000000)
: W  n: ]8 w0 K! D7 a& A# ^- M3 X#define SHAER_RAM_SIZE         (0x20000)   
  j! ~4 ]) q% R& d7 d7 I. I# B* V$ b# |
typedef struct
% S9 W% m& X7 S" S{
( Y. D9 R2 K8 ]        unsigned int a;
0 Q" c* m& F" i( j! [% o        unsigned int b;
5 m1 ~) o+ }( e1 w5 o0 }$ L1 c        unsigned int packet_cout;( J6 L: M4 S' X6 t; p/ N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 {2 b& X8 \) \* p
3 ~0 @3 k3 ?% c8 p. Tvoid read_MSG_buffer(int *baseaddr);2 u& z& {4 R  {$ q/ K4 Q& e
unsigned int count_copy = 0;
. |$ {! \  z& C8 G8 `# {0 w1 ]
8 @& l3 e. {- j% Lint main()! R. `) b0 Q# l7 W" a; f
{
3 A2 B4 m* X$ x% M4 k2 D1 K        int fd;% _0 b0 T3 R* j0 e+ {; G8 I" O
        int *mem = NULL;! D; [7 A' N( D  a! J
( X+ A- k& |# q
        if((fd = open("/dev/mem", O_RDWR)) <0)$ \/ x1 r4 L% R4 z
        {
, E% l( A( s" k- R  l                perror("open error");% C6 G, d/ n$ A* B$ b
                return -1;
+ s8 |, j# _3 e  q1 Z        }# R# A- m5 W$ s/ x6 ^2 D/ ^2 u, |
        # q' d3 L" [) G
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 Z/ \7 q8 W3 W6 g( ]6 U% k% j4 ~: s" w5 B" H
        while(1)6 ?, ^% ^7 A: h# @
        {
) L* l2 g/ i# y" I$ F                read_MSG_buffer(mem);
( e1 D2 Z3 y! P8 ]9 e1 t        }               
1 N( p8 J5 k+ D! S+ F4 v' `}1 l% W, ^1 |* W

- m) z9 P# j& h6 }6 Yvoid read_MSG_buffer(int *baseaddr)
4 h" a; d3 S2 u. ?" E, t# O3 s{
4 q: z. K3 w; `. A- W5 F5 o; O! f  z        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 O1 }* _' t2 N, k3 G3 W$ V
: w- i/ e- Z! C; E2 g, \4 t0 H$ b        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ b+ Z" V. ?0 E+ w. `8 K: Z( Y

1 a1 q( Y: e/ G3 ?- _7 {( Q        if(pshreRAM->packet_cout != count_copy)" V7 F9 P4 a/ \. F+ Z% A5 r
        {/ ?1 X4 ~9 E) a* a1 i3 M( r5 [
                printf("a is %d\n", pshreRAM->a);
) u9 `1 z# L" j' }  m. H                printf("b is %d\n", pshreRAM->b);$ z+ i! G* h5 r* C7 j0 ]2 @
                printf("count is %d\n", pshreRAM->packet_cout);
0 h" j" x& e  S, \                count_copy = pshreRAM->packet_cout;" M- D+ P( A$ e1 c$ `& y
        }
& |! S3 G+ ^$ g6 `% c: ?        else# A  z# e, V2 Y' Z9 F" `: Z0 M
        {- W& s" H3 D, G  v  u4 F
                printf("No effective message!\n");
3 d+ P9 X: R0 g. ~        }
' n1 y3 n& P0 t% Q) X' N  W) ^}
) c  ^: D2 V# w0 i. g* w$ w
! r. y, l, P, _: H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* k' m7 |8 O* U; G& Z% y2 ?
* ^8 y0 O$ O( \
# j/ {# t9 Z- Z) @) w8 R6 _) `* F7 o
% Z# l! ^: O" l6 L0 I4 R0 Z: Y9 R5 C) D. l# i6 Y/ {! m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-15 22:09 , Processed in 0.039938 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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