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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 A2 q% a0 K6 x; J: f2 B* Q
* M* P* N0 p% }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; q! u, V2 u4 X( I#include <unistd.h>0 z; w% t5 e7 ]$ G4 [
#include <sys/mman.h>1 J, N+ U8 B6 m9 r
#include <sys/types.h>- U1 V' k0 E  g  p& O
#include <fcntl.h>
7 d; {0 Z6 S0 d$ ^$ T( P8 I8 k8 S5 C' n7 _* v
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 `$ f( j) W; [( j  U, p* Q+ _. L' D8 g' a
typedef struct
8 J3 C) O# a) f! Y4 M( I5 M{
# J* e8 k4 j, J        unsigned int a;
: i9 d5 x. g/ u6 {7 m" L        unsigned int b;+ F: K9 K+ g; o* e" g
        unsigned int packet_cout;" }- c! g1 p# X; j) G- R# x" u# t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 p4 Z5 P) v/ ~* q4 `+ n# _. j  e, o0 o. a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, n. u4 v3 F: wunsigned int count_copy = 0;7 W9 _- S, ^& {9 W1 {6 ?, o

% z0 X8 v* \6 e: e" r! H$ o' L4 `; a- d
int main()
8 T- z: P. G+ h; }& k4 c3 k{4 N6 r/ T- K# j/ L7 m0 _# k$ V, P
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 D5 Y& b& t4 o* @9 W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ y7 A& P0 R2 f  a* r, a6 I
' {3 m/ O0 g$ D        while(1): D8 Y* [% m- l% s
        {
2 ?! X, b. k4 X+ o  k1 s  G% y6 K+ R1 r                read_MSG_buffer(pshreRAM);
' N# L  i# e  E. ?3 N        }                0 U0 n- |# K' s" L: B3 \
}5 W, m& h3 y! u* B: I3 o

& M, i/ V* J( ^( b2 Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# }& [8 S2 ?* T6 I+ W! K
{
% t& S* Y# e  ?$ V/ v& V        RX_MSG_PROTOCOL buf;
, t& i# t" Z  I        - Q3 T5 j/ O$ }' d/ U
        buf.a = pshreRAM->a;
7 Z; o' `5 s" d' d# ^, E        buf.b = pshreRAM->b;  a2 t6 N4 O: o3 t7 ?! ?; _
        buf.packet_cout = pshreRAM->packet_cout;" _2 Z, P6 r' O  l
        
5 v. j/ A1 G3 n6 E# i2 }        if(buf.packet_cout != count_copy)
- B. |' d3 S: `4 o        {
5 C0 C, g, ^' I5 c                printf("a is %d\n", buf.a);  \- ~3 K# H+ v1 z$ W
                printf("b is %d\n", buf.b);
+ j! d# ?/ ]$ Y6 H0 w# v# T2 R                printf("count is %d\n", buf.packet_cout);/ r; k; p  ?6 {) Z! `, Q$ T9 K: D
                count_copy = buf.packet_cout;
" H/ U. {" z8 T& q3 c        }
/ _+ [9 Y, ~) h. \7 m4 h* T        else
, s8 w6 g5 ?9 e: I7 }* f, O        {! H5 t4 s0 F! ^# ?
                printf("No effective message!");2 h7 l' D3 Z8 f
        }
0 \8 W* v0 l$ c2 m5 c( }}, f! W5 f8 s, n' S
, {- O  J1 ?; o! I( @8 l  X  `
2 {+ ?/ e4 X6 n  I; V6 |2 m  t1 b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" P) h8 P; K. P3 c9 W
使用下面代码,对内存使用了mmap函数后:
/ o, K. y* d5 Z; n#include <stdio.h>
2 Q/ F9 R9 P2 Q8 h6 X#include <unistd.h>& U+ T( k+ G; T+ x  M4 i
#include <sys/mman.h>( S0 O) U# R  O
#include <sys/types.h>
5 O' r. {6 x  a8 p* r5 `, o#include <fcntl.h>% D, k( t2 d, M* z# x  z
( U! T+ e9 ~: s4 R; M. i
#define SHAER_RAM_BASE_ADDR    (0x80000000)6 q* D/ v2 c0 A& `6 A! \# k
#define SHAER_RAM_SIZE         (0x20000)   
5 |& N6 p/ f& a2 f4 F+ [3 K
/ p; @! Z4 j4 Vtypedef struct1 P* c: b3 Z+ N+ q$ D* u
{* R# x' `# d; g* h
        unsigned int a;
; W  z9 P9 z5 i2 h5 n  `6 `3 q9 G        unsigned int b;
2 E; R' {" u/ ?3 r# M        unsigned int packet_cout;' h$ \2 S3 v2 P6 u. L" G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ U( u2 Y2 O+ N5 _3 X1 j2 w9 n! Y7 L% G
void read_MSG_buffer(int *baseaddr);
" A  n. i) j7 }- V, a; Q6 Lunsigned int count_copy = 0;: P; ^9 L1 W$ ]4 A$ z( \6 C

0 X1 N- y4 c3 E! S/ b5 rint main()
" V; M* p' j  B- }6 b* ]{8 n4 q! S8 T- R4 `* {7 C, C# R
        int fd;
' O4 e# H. w" d7 E# K        int *mem = NULL;0 Z/ N9 a/ y8 a5 d- V/ A

5 J, u: ?+ A% t( j        if((fd = open("/dev/mem", O_RDWR)) <0)! M! j- O1 E3 k
        {
( _" m" v9 H6 L8 j7 g1 q8 I                perror("open error");
' I% T$ e$ h& f4 |3 T                return -1;  y1 F4 X" x$ y8 |! H1 @* h
        }, s/ R3 X5 p8 X$ u: ~3 @+ \
        4 t/ E$ I0 g2 P0 A" Z. ]
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 b+ ]5 _/ X* V" Q6 E7 w$ |

, \% l; Q  i2 W9 S; C$ d        while(1)
/ J; \6 s" E* v        {
  s8 U3 A8 f0 X: f) ^                read_MSG_buffer(mem);, O! p* y* I; A+ c: S
        }                7 y4 Y3 g/ f  l# M: l) `+ s8 g
}) l+ w; C; b8 {# v1 G

2 p  p  h# G2 J2 m3 i0 Lvoid read_MSG_buffer(int *baseaddr)
& ^5 n) y, q7 c{
  e; `- u% `, K$ e( g% w        pRX_MSG_PROTOCOL pshreRAM = NULL;
  R8 n' _/ \2 M/ X5 q1 \' H3 }& Z. |1 u& E
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 f, {5 R9 o8 ]0 d: I  Y
, G, K, }! W" l& \' @8 u& ?
        if(pshreRAM->packet_cout != count_copy)8 N- m) ^3 O' I( z$ _) Z& _8 k; `' j
        {% w1 Q0 a% v$ V! N1 c
                printf("a is %d\n", pshreRAM->a);
5 [7 r& r, s# a( b                printf("b is %d\n", pshreRAM->b);6 b6 B% S, [; {9 N
                printf("count is %d\n", pshreRAM->packet_cout);8 S9 Q  Q4 m) _
                count_copy = pshreRAM->packet_cout;" J6 o7 Y2 Q* c, j1 b
        }8 ^7 ^% C; D$ e1 L
        else" Z, v3 W: X* [* G+ ?; g
        {, ~7 C! ~" T5 e& K8 W
                printf("No effective message!\n");
2 y: O5 n9 @" L! F3 L        }" c8 A; U" d& m
}
4 Y, j& j: z1 v/ v7 W3 _2 z; m, t8 T, T& ]0 X  n. R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' Z7 p5 a4 f' X) t: {
/ A0 z7 H5 K& e! [' R3 }3 `5 p
& W9 w! W' f& Q: q. t* h
+ D# n, T) t# g
7 d- h& a+ x" J2 x( j$ r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 00:15 , Processed in 0.037208 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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