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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 M1 U; w3 {5 B( x7 A: r3 s5 R2 }5 _- T0 |5 R. k- m7 x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 {# G# R, t6 ~% H#include <unistd.h>
: @4 N! X& D% }$ @#include <sys/mman.h>
% c, S! g# r; @$ @) J) D#include <sys/types.h>
* U" K) v! {; N1 p. y- D#include <fcntl.h>
6 c: F5 Q% k& h$ A+ Q' M7 j
$ o& x2 o. ^  }7 Z- M#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 I0 z, k& h/ b; T
( F# t# K! Z0 ]' N
typedef struct& Z) H5 c1 g; y6 E/ }
{2 j9 ^. t! @1 T$ V) r
        unsigned int a;
1 \( Q, s" K9 X, v        unsigned int b;1 y5 u. V; j7 b6 j# ~- e0 L
        unsigned int packet_cout;
( X: }- h# `- c5 o) T! P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 Y$ r( n" ?! c' }& u
) \) j& b) C# j4 K  i1 J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 E; A5 B# o1 h/ ^8 R5 \' B; ]7 {
unsigned int count_copy = 0;1 _& o- @- D; L

% s  y: a( K$ |* h1 A  d5 M$ g
, q/ S( v/ v) ]int main()  }, G1 _* i6 k! ?: G# v- K
{# o! ^/ s5 K0 N1 v3 |
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ h8 H- ~8 t" _& L' b, p        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- @" X, }% _% d" ]) N

/ `0 l; U8 M5 }2 C        while(1)3 O1 s- w) g! d5 C6 _
        {
4 S# x/ w" u1 j& _- _                read_MSG_buffer(pshreRAM);
! |1 h, U. ]+ R5 N# T& q3 o        }               
7 Q2 \) F/ E% |; H: f7 M' ?" }}
" a3 D% }  p- O: F, [" ]; d. h! N4 i; R! g" [1 a. X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, W: K2 u! N; ]7 z: T$ u1 e  d{& q; D6 g. D4 t; y# |! A+ E
        RX_MSG_PROTOCOL buf;
8 {3 y1 D& [8 d# ^9 i, n7 R        - a/ g, m; N4 d. G5 _
        buf.a = pshreRAM->a;- A0 [) |- ]3 i5 d7 z( X
        buf.b = pshreRAM->b;
- D5 }& f: m/ _        buf.packet_cout = pshreRAM->packet_cout;
  _2 g+ q* O& @        
6 D+ F. f) c* u        if(buf.packet_cout != count_copy)
8 q: o7 A3 I: y. s' f) s+ d2 T        {$ y4 d1 |) o* K. [8 Z. Q
                printf("a is %d\n", buf.a);
* g0 h  p% x+ U, @                printf("b is %d\n", buf.b);
9 S  A5 R* E# Y                printf("count is %d\n", buf.packet_cout);" i. ]8 `# t8 \4 s7 v
                count_copy = buf.packet_cout;
) b9 S$ ~- B. W4 ^% O2 m        }8 f4 p  q7 V+ W8 R5 V) ]/ _2 u! k: w
        else; p4 _0 S% i- u) v
        {/ \2 T2 r2 s: @" z: I! e! j' E
                printf("No effective message!");  y4 `8 U+ j: k( t  {6 u
        }8 m1 D6 F2 p. J& [# J/ `
}& ~& H6 o3 Y. I/ y9 o
; b& `1 L* f. A& _: y/ c

& c: p( C% @2 T* H- A" H$ Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* |# Z' w  E) z( r7 ^使用下面代码,对内存使用了mmap函数后:
" ]1 B. e) O& a' f. d#include <stdio.h>
( |/ G/ v3 ^4 I" _* C. g6 U#include <unistd.h>' L% F0 Q" S7 N4 B, |
#include <sys/mman.h>0 H" K9 b* W5 D) B! D5 U8 P4 ?
#include <sys/types.h>$ y, d$ z2 O  p$ n" o
#include <fcntl.h>: x1 e+ }& [9 U* G

! q& y; h7 a2 ^- x2 ~, g#define SHAER_RAM_BASE_ADDR    (0x80000000)& F( b4 {9 w3 Q3 F; b9 f2 v; U% s/ k" }
#define SHAER_RAM_SIZE         (0x20000)   7 b" O( B8 Z4 K5 S* Z% ]. w

( E! H  [" ]( J+ r2 z7 Ttypedef struct
8 c) [; @4 D* m8 e" u& }1 E{
0 Z! t& ^' i9 s5 I        unsigned int a;
6 J7 x$ J$ ]# p  M4 ~% Y        unsigned int b;2 l% B: g( g' J
        unsigned int packet_cout;1 R$ n( w8 E( f4 t, X3 {6 S2 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ @4 E# t2 J  E( W1 a6 Z! B/ f
' o  k( B0 \9 z* Q: }' C1 E
void read_MSG_buffer(int *baseaddr);
0 Z6 c  c8 }; l, Y0 M7 w0 }8 [unsigned int count_copy = 0;0 _0 ?& O6 c/ Q, \
# x& N. H* C& ^" M5 S5 A* H
int main()9 ]* T4 t6 L% v! B, s- y/ J
{
* S8 [6 G# B, I4 {$ u( [6 n        int fd;! n$ X$ F5 w! e# R2 _
        int *mem = NULL;- w' d, R$ V" {: u8 H5 o+ J5 y
) |3 ], n; S; i
        if((fd = open("/dev/mem", O_RDWR)) <0)
! a* \4 w: L# S9 A$ h  }        {- J. `  W. p  }# r
                perror("open error");) \. D- v1 {) x. Q
                return -1;
; _, }# H7 k9 l8 Q' u/ ?3 M6 ]1 L        }, T  T0 }: W: r" n) ?! q2 c- s
        % v% q- ~# Z# ?6 R
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 g. y& c. |! V/ y' r1 q1 j4 j

  K3 r  B- k6 V5 s2 ?5 O5 j: {        while(1)+ u$ ^' F3 q; g
        {  A" Y9 Y3 a. p8 v* A' v! M
                read_MSG_buffer(mem);
0 R' Z+ r+ @* L7 f- O        }               
9 ^( l* q8 E' ?* p9 [}# A+ i1 J) o- x) J" Q( O( k

( N: }9 K6 j& C$ Q7 A( T- ~) zvoid read_MSG_buffer(int *baseaddr)
  l, b+ [% _) o) O3 Z- O{
% V1 `, `0 X6 T7 M$ n5 O% ]6 }9 K        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 \: a8 Q5 C# r; S# m& h; Y7 |+ M! S$ Z3 o2 @1 M
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 M0 R% X0 }  D
3 L, m% @( A7 b        if(pshreRAM->packet_cout != count_copy)% n: o+ g! ]( i, v* ^0 E
        {1 {# \3 ^& P, Z! r
                printf("a is %d\n", pshreRAM->a);
! m! c4 F, l- [8 o                printf("b is %d\n", pshreRAM->b);: m8 O8 I: B5 P2 T9 @, C& Y
                printf("count is %d\n", pshreRAM->packet_cout);" g; t' o/ [0 w: [8 T, m
                count_copy = pshreRAM->packet_cout;
% D* f* m1 G9 L6 n( {5 n+ {6 t        }
0 B) J, T7 r0 g" M5 P7 C        else
# ^" F9 F* D; |        {
1 y7 U& p4 w( Z! u' l                printf("No effective message!\n");
: w/ Q9 Z2 f1 l/ w8 }        }) Q4 J) H2 j) F* c) p! o
}
1 I0 h: W- F! Y+ U; t/ i3 D9 R* k: _4 l- x# l7 O: d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 Y6 a/ w& z5 K! ^& r2 t, Q' {! `! I: ]' c! @6 o, p) i, h
! p2 v" u) V- T- i2 S: [: c$ P' Z1 x

& f5 b% ^5 u! f4 t, U
7 S+ z  p* L1 N4 h  s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-6 09:03 , Processed in 0.047707 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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